说到加密算法,开发人员基本都不会陌生。我们平常开发中接触形形色色的加密算法,简单来说分为对称加密算法与非对称加密算法以及散列算法。算法的区别在哪呢?我们可以这么来理解三种算法的区别:
代码语言:javascript复制对称加密算法:加密算法与解密算法的秘钥key一致。
非对称加密算法:加密算法与解密算法的秘钥不一致。
散列算法:没有秘钥,目前无法反向解密。(暴力破解除外)
我们为什么需要加密?我们日常生活中登录密码或者各种隐私信息都需要进行加密保存防止信息泄露。那我们接下来来看看这三种算法类型分别有什么样的算法呢:
代码语言:javascript复制对称加密算法:目前主流算法有DES算法,3DES算法,AES算法
非对称加密算法:目前主流算法有RSA算法
散列算法:目前主要以MD5和SHA-1算法为主
本篇文章就围绕这6个算法进行具体的讲解,可能这些算法大家最熟悉的就是MD5算法了。为什么熟悉呢?MD5算法最常用的一个场景就是用户注册,密码进行MD5加密,密码无法反向解密可以提高安全性。接下来我们开始第一种算法:MD5算法。
MD5加密
MD5 其实是一种哈希算法,它实质上是对一段信息产生信息摘要,以防止信息被篡改。严格来说MD5 不是一种加密算法而是一种摘要算法。无论是多长的字符串,MD5 都会输出长度为128字节的一个字符串,转换成16进制就是32个字符。我们一个直接的MD5算法:
该算法就是一个最基本的MD5加密,加密成功将加密字符串转化为纯小写。我们可以看下效果:
可以看到MD5加密效果解决了,但是MD5虽然不能反向解密,但是可以不断使用MD5加密进行尝试暴力破解,所以我们一般使用MD5加密都会再搭配不同的加密算法进行使用。我们设计如下一个加密算法:
代码语言:javascript复制将接口所需的必需参数加上当前时间戳按照key=value的ASCII顺序进行排序
组装字符串左右拼接一个加密秘钥secret组成代价密字符串waitSign
将待加密字符串进行MD5加密并转化为纯小写
现在我们可以在代码来实现下这个结合了特定算法的MD5加密:
我们直接将设计的算法封装成一个公共方法,我们在接口中直接调用
代码语言:javascript复制createSign(obj, secret)
然后将必需参数结合当前时间戳拼接成json格式,作为第一个参数进行传参,秘钥secret作为第二个参数传参。我们看下接口调用代码:
我们可以看下新的效果:
我们在新的算法结合了当前时间戳,我们就可以对时间戳进行限制一分钟内有效。可以有效保证接口的安全性。说完了MD5加密,我们接着来将建另一种加密算法SHA-1算法。
SHA-1算法
SHA-1算法是和MD5一样流行的消息摘要算法,但是SHA-1 比MD5的安全性更强。SHA-1会产生一个160位的消息摘要,16进制下就40位字符。我们来看看具体实现:
可以看到我们将原密码经过SHA-1加密进行转换了。但是虽然SHA-1安全性比MD5更高,但是直接简单的进行SHA-1加密,一样可能被暴力破解,所以可以采用结合刚才设计的算法进行SHA-1加密,具体我就不多说了。可以自行尝试。接下来我们来看看对称加密。
DES算法
DES 加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用相同的算法。DES加密算法对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥 的人才能解读由DES加密算法加密的密文数据。因此,破译DES加密算法实际上就是搜索密钥的编码。暴力破解DES算法其运算次数仅为2^56次。
我们接下来看看如何实现DES加密算法:
这里我仅采取cbc模式加密进行演示,对DES加密其他算法模式有兴趣的可以自行去研究。我们可以看下加密效果:
因为DES算法是对称算法,所以可以使用相同算法进行反向解密。我们看下算法如何进行实现:
可以看到我们成功将经过des-cbc进行加密的加密字符串给成功解密微原字符串。但是我们也说过DES算法使用暴力破解是完全可以进行破解的,所以3DES算法其实就是对DES算法的优化。
3DES算法
3DES算法其实就是基于DES加密算法,采用三次不同密钥进行三次不同的加密。所以加密后密钥强度会更高。接下来我们来看看3DES的实现过程:
可以看到我们成功使用3DES进行密码的加解密。主流的对称加密算法还剩下一种:AES算法。
AES算法
AES加密算法是密码学中的高级加密标准,密钥长度的最少支持为128位、192位、256位,分组长度128位,算法应易于各种硬件和软件实现。AES本身就是为了取代DES算法而产生的,AES具有更好的安全性、更高的效率和灵活性。
可以看到,我选择了秘钥长度为128位,算法模式为CBC模式的AES加密。我们可以看下算法效果:
到这里对称加密算法三种算法我们都进行实现了。接下来谈谈非对称加密。与对称加密 算法不同,非对称加密算法需要两个密钥:公钥和私钥。 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的 密钥,所以这种算法叫作非对称加密算法。接下来我们看看非对称加密:RSA算法。
RSA算法
RSA算法通常先生成一对RSA密钥,由用户保存私钥;另一个为公钥,可对外公开。为提高保密强度,RSA密钥至少为512位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或AES对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。到目前为止,还未出现任何可靠的攻击RSA算法的方式。
可以看到,我们使用秘钥长度为1024位,生成公钥与私钥。然后使用公钥进行加密,使用私钥进行解密。接下来来看下运行效果:
看到加密后这么一大串是不是瞬间打消了去想方设法破解的想法了呢?RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。RSA是第一个能同时用于加密和数字签名的算法。
在我们使用私钥进行签名,用公钥进行验证。验证成功返回true,验证失败返回false。我们可以看下效果:
当然RSA还有更多API,在这里就不多说了。具体可以看下API文档。到这里六种加密算法我们都简单的尝试了一遍。