文章前导
在日常的开发过程中,主要使用的加密算法有摘要算法、对称加密算法和非对称加密算法。融合自己的理解和一些简单的示例,记录下来,便于日常查看。后期也会不断的更新该文章,由于平台问题,只能实时更新在个人博客地址,如有兴趣可以参看 https://www.qqdeveloper.com/2019/08/28/data-encrypt/ 。由于个人对安全这块没有特别的系统化学习,如有错误,还望指正。
摘要算法
1.什么是摘要算法
常用的摘要算法有MD5,SHA1。摘要算法是一个不可逆过程,就是无论多大数据,经过算法运算后都是生成固定长度的数据,一般结果使用16进制进行显示。
2.MD5和SHA1的区别
MD5结果是128位摘要,SHa1是160位摘要。那么MD5的速度更快,而SHA1的强度更高。
3.代码示例
$content = "123456";
echo "sha1加后的字符串为:".sha1($content);
echo "\n";
echo "md5加密后的字符串为:".md5($content);
sha1加后的字符串为:7c4a8d09ca3762af61e59520943dc26494f8941b
md5加密后的字符串为:e10adc3949ba59abbe56e057f20f883e
4.是否可以解密
摘要算法加密后的数据是无法解密的,平常我们所说的解密其实是通过撞库达到解密的效果。所谓的撞库就是,我们实现有一个加密后的数据,我们将多个加密后的数据称为数据池,现在我们手里有一个明文数据,我们通过将明文加密后去数据池中的数据进行一个一个的匹配,如果匹配到了,证明数据池的该数据在加密之前就是我们手里的明文,通过这种方式来解密。
5.如何加强安全强度
在第4点中,我们知道我们加密的数据可能被破解,那有什么方法可以减少这种情况的发生呢?在程序开发中,可以给密码加盐、设置密码的复杂度(由字母、数字、_以及一些特殊字符组成)。
对称加密算法
1.什么是对称加密算法
[引用百度]数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
[个人理解]所谓的对称加密,可以这样简单的理解。在加密的过程中有这样几个变量,一个是加密的内容,二是加密的方式,三是加密的密钥。我们发送方通过加密的方式和加密的密钥对加密的内容进行加密,发送给接收方,接收方在接受到数据之后,需要使用发送方相同的加密方式和加密密钥进行解密才可以将数据进行解密。下图是示例图:
(图片来自百度,如侵权,请联系删除资源)
2.常用的对称加密方式有哪些
常用的对称加密算法有:AES和DES。
DES:比较老的算法,一共有三个参数入口(原文,密钥,加密模式)。而3DES只是DES的一种模式,是以DES为基础更安全的变形,对数据进行了三次加密,也是被指定为AES的过渡算法。
AES:高级加密标准,新一代标准,加密速度更快,安全性更高(不用说优先选择)
3.代码示例
$content = "123456";
// 该函数是获取有哪些加密方式
$encryptMethod = openssl_get_cipher_methods();
$method1 = "AES-256-ECB";
$key = "123";
$encrypt2 = openssl_encrypt($content,$method1,$key);
echo $encrypt2."\n";
$decrypt2 = openssl_decrypt($encrypt2,$method1,$key);
echo $decrypt2."\n";
$method2 = "DES-EDE3-CFB";
$encrypt3 = openssl_encrypt($content,$method2,$key);
echo $encrypt3."\n";
$decrypt3 = openssl_decrypt($encrypt3,$method2,$key);
echo $decrypt3."\n";
输出的结果依次是:
// AES加密结果
POp27jGMYYylmA3umO1zSw==
123456
// DES加密结果
a44LkMVb
123456
非对称加密算法
1.什么是非对称加密算法
[引用百度]非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。下图是示例图:
(图片来自百度,如侵权,请联系删除资源)
2.工作原理
1.A要向B发送信息,A和B都要产生一对用于加密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
3.代码示例
如下的公钥内容是通过平台生成,为了保证加密和解密的正常运行,请确保密钥和公钥是一对。可以参考该网站 http://web.chacuo.net/netrsakeypair 具体使用参考下面截图
// 公钥内容
$publicKey = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA448HrtB/ORfECv/owcAB
fN/PfAy2G7BGPkIy96QuFQhgf7pTF+X4x4wRZgRtdmhnMgtpessx6UXaNzRaDsa8
IWozFTrNu3P7xcJxdcWbdlHdMYASmp4xOe6ct/tGURI8HBn4yjxTES4IFAoPxNCt
dgs31dsJnq0uUa3C1VTWbPtdZX+GX/GOsl2hbJOhn/WrRlOIGzI2oSjhdaPXGD1w
xXKCZM1RhcjQoWQLnFerlOeqNRhW+qgoJ7nRD+PhEajA0LhUMHvyeFR+A37DuFdI
KBD58b2EnBZmYyZL7umeNjjhruSyeD1Y5qOvuKOoL7vQOVzAdVwokcMqDmXurR4s
kQIDAQAB
-----END PUBLIC KEY-----
";
// 私钥内容
$privateKey = "-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDjjweu0H85F8QK
/+jBwAF83898DLYbsEY+QjL3pC4VCGB/ulMX5fjHjBFmBG12aGcyC2l6yzHpRdo3
NFoOxrwhajMVOs27c/vFwnF1xZt2Ud0xgBKanjE57py3+0ZREjwcGfjKPFMRLggU
Cg/E0K12CzfV2wmerS5RrcLVVNZs+11lf4Zf8Y6yXaFsk6Gf9atGU4gbMjahKOF1
o9cYPXDFcoJkzVGFyNChZAucV6uU56o1GFb6qCgnudEP4+ERqMDQuFQwe/J4VH4D
fsO4V0goEPnxvYScFmZjJkvu6Z42OOGu5LJ4PVjmo6+4o6gvu9A5XMB1XCiRwyoO
Ze6tHiyRAgMBAAECggEBALtXC1ouKC8Wk70ChdrMee0WTLixtlMBQjMLSO57abzD
Er7U5IeuOqv9cm1sg7mRpjObFZGUK1kCuu3r2aCEmGliBwAZUzpZ+BMNS19L+frk
1pdj+uz0A07QVJFa+r7PplD0SNAl7bUdEmV9CxJbQhMGlUcodrj9lj6EMPx0Rbud
gBLJbZCK+h8lNgbGYce+J0+CDDnTapsPKFP/DvwZwgE4CkpVciEtbH2RzU45qRVI
If7/3YBB3q+eD4GrIuBgmLUT7bs2vKn/RXxN8YARoEwUqj/Gg2iXQeSPtW0iWuV/
cbCT6Sfb1J7KGXiEDKrsNH+e29TcXsIDbrMHSyj3IeECgYEA8gtQJbHDhcXjDSx1
5SWKpWdhFNEp/ggdFj8hAroVBHPmGelvkY6i4OZ/IGulzIrJY2uxXwU91KMuoZ5/
IdOQSZiehsba1PCn9ZAVY/KZZvfAYX96tUKUmnar1GyhhcSAljPK2zKqYbGnJbnI
TVMpSthdNgEi/XNrEWrpXFWimI0CgYEA8K3nhWBt4xG87x9ifEpJjFlf/8hlmKr9
8SMi4qm/ja3huL4si1VVkO8flqqhkkr+HqtBKOe+bYMZBUDtYnv/netMeQuCdvJY
sfXPeSguXgGhjxP6gNswMYnzOykoGyPT84gOXBuY2M8X9nB6SkAQ+OL/sf0ltQdP
4mdQNQBKjRUCgYEA5sLmbKmoMZfSurKSzB8Yqk1/fytTj8AIizcwr7rdYttkm3u1
RN7qZuUaerxm3DXNfx4jguYqZtoVET1dE9DylVgOe4yHAdFXMIVn/1xB6Kt4HPw+
7yVFLGbLt8DB1hjcR1elpYoOawnGw+72CtKoYZUaeOxogZ9Sis6VIdT7KdkCgYEA
tkmw0fcwI0xbAe2OZT7Kp89Fg3BfapsPzORk1rHkkEVDce4vxLQ0I5rJHQ9NYoUE
JWxl5LppI36oo68CXJY4C36cpA1QmhCBlv/rTQNe4vpvR/PExnW88bhfDc7lPnEL
ZicFYUPRp1xq9M9KABS4Bhm/uipWtd685WiEejAnRuUCgYA4ddYkl6XwA/HQ1Kyr
iwAllDdusuGW62DMeXC2h2qw8yCvG38YAQu8lRDCFm0JW/sD2sgVCtt9c147ZFoB
mUghpFOZRZvbxEdPzIyb4Gn0wN+3Jwjrl9uPiY82q92G0E253PKug2EJYapa411/
fxrEXMi/X+VwggoEnOqXsbyrHA==
-----END PRIVATE KEY-----
";
// 加密字符串
$content = "123456";
/**
* 使用公钥加密,私钥解密
*/
$encrypt = "";
openssl_public_encrypt($content,$encrypt,$publicKey);
echo "加密之后的数据为:\n";
var_dump($encrypt);
$decrypt = "";
openssl_private_decrypt($encrypt,$decrypt,$privateKey);
echo "解密之后的数据为:\n";
var_dump($decrypt);
echo "\n\n换个一个方式\n\n\n";
/**
* 使用私钥加密,公钥解密
*/
$encrypt1 = "";
openssl_private_encrypt($content,$encrypt1,$privateKey);
echo "加密之后的数据为:\n";
var_dump($encrypt1);
$decrypt1 = "";
openssl_public_decrypt($encrypt1,$decrypt1,$publicKey);
echo "解密之后的数据为:\n";
var_dump($decrypt1);
输出结果(下面所看到的特殊符号不是所谓的乱码,而是加密之后的字符串,加密后的内容不是一成不变的,我们每请求一次,所看到的加密内容是不一样的,但是不会影响到我们解密)
非对称加密与对称加密区别
1.对称加密比非对称加密执行更快。因为对称加密使用的是相对更具复杂的算法,因此在数据加密的过程中消耗的时间更长,导致效率更低。尤其是针对数据量大的情况下。
2.对称加密比非对称加密的安全性相对低一些。由于对称加密的算法复杂度更高,因此在密码强度来说,必然是更高的。
3.对称加密中,在解密方需要解密时,需要知道加密方所用的加密方式以及加密的密钥。
4.非对称加密时,接收方只需要知道加密方的公钥即可。
5.在实际过程中,非对称加密并不是绝对安全的。例如中间人攻击,所谓的中间攻击就是,恶意攻击人,在发送方将公钥发给接收方的过程中将公钥进行拦截,将传输的公钥替换为自己的公钥,当接收方接收到公钥之后,对数据进行加密,发给接收方,恶意攻击人接受到该加密后的数据,利用自己的密钥就可以恶意的窃取数据。针对这种情况,我们尽可能的使用加密的https传输协议。如下示例图:
如何选择加密方式
1.根据不同的业务场景,当我们需要密码强度高的情况下,可以选择非对称加密或者对称机密,当然是非对称加密更可靠。
2.执行效率,上面我们也提及到非对称加密比对称机密的执行效率更低,如果愿意选择通过效率来换安全可以选择对称加密,当然也不是说对称加密不好。
3.在实际的加密过程,尽可能的增加我们的密码复杂度,同时定期更换密码等操作也是一个加强数据安全的方式。
4.选择一些可靠的安全函数。例如PHP的mcrypt_encrypt()、mcrypt_decrypt()加密方式已经存在被破解的安全隐患并且PHP官方也不建议使用。