说到密码学,阿粉现在真的是脑袋很大,为什么?因为密码学真的很难,有各种加密方式,各种解密方式,比如MD5、RSA、DES。无论如何,他们有很多。今天阿粉就来一一分析密码中的各种加密方式,以及它们是如何使用的。MD5的前世今生其实,MD5是由美国密码学家RonaldLinnRivest设计并于1992年发表的,用以取代MD4算法。也就是说,在他之前就有了MD4算法,MD4是MIT教授RonaldRivest在1990年设计的一种信息汇总算法,是一种用于测试消息完整性的密码哈希函数的实现。它的摘要长度为128位,一般128位长的MD4散列表示为32位的十六进制数。MD4设计出来之后,有两个不服气的人非要证明这个东西是错的。关键是这两个人真的成功了。一个是Denboer,另一个是Bosselaers。一群人居然发现了MD4的漏洞和完整版MD4的冲突(这个冲突其实是一个漏洞,会导致加密内容不同但可能得到相同的加密结果)。毫无疑问,MD4已经被淘汰了。而列维肯定不服气,于是在1992年,列维向互联网工程任务组(IETF)提交了一份重要文件,描述了MD5算法的原理。由于这种算法的开放性和安全性,在1990年代被广泛应用于各种编程语言中,以保证数据传输的正确性。后来,这个MD5产生了深远的影响。当时据说Denboer,另一个Bosselaers,两位大佬又开始批评了,发现MD5算法存在伪碰撞,其他的也没发现。加密后的结果。所以就没有后续的内容了,所以在接下来的时间里,MD5开始被大众广泛认可,一晃就是四五年。1996年后,该算法被证明是弱的,可以被破解。对于安全性要求高的数据,专家一般建议使用其他算法,如SHA-2。2004年,证实MD5算法不能防止碰撞。因此不适用于安全认证,如SSL公钥认证或数字签名。因此,之后MD5陆续退出了历史舞台。虽然退出了历史舞台,但影响依然存在。仍然存在MD5加密方法。不信你可以去看看你自己的项目,看看有没有这方面的资料。这个MD5码存在吗?什么是MD5?MD5码使用512位的组来处理输入信息,每组又分为16个32位的子组。经过一系列的处理,算法的输出由4个32位的组组成。四个32位块连接起来生成一个128位哈希值。我们看一下上面百度百科给出的流程图。其实MD5一般来说就是对一个不变的数据进行加密,加密后的字符串也是不变的,只要对元数据进行简单的字符修改,那么经过MD5加密后的密码数据也会随之改变,即相当于一个人的“指纹”。用Java实现MD5真的太简单了。示例代码如下:publicclassMD5{/***@paramtextplaintext*@paramkeykey*@returnciphertext*///使用秘钥加密publicstaticStringmd5(Stringtext,Stringkey)throwsException{//加密字符串Stringmd5str=DigestUtils.md5Hex(text+key);System.out.println("MD5加密字符串为:"+md5str);返回md5str;}//无密钥加密publicstaticStringmd52(Stringtext)throwsException{//加密字符串Stringmd5str=DigestUtils.md5Hex(text);System.out.println("MD52加密字符字符串为:"+md5str+"\tlength:"+md5str.length());返回md5str;}/***MD5验证方式**@paramtextplaintext*@paramkeykey*@parammd5ciphertext*///根据传入的key验证publicstaticbooleanverify(Stringtext,Stringkey,Stringmd5)throwsException{Stringmd5str=md5(text,key);if(md5str.equalsIgnoreCase(md5)){System.out.println("MD5验证通过");返回真;}返回假;为什么不推荐使用MD5?既然我们上面说了MD5比较强大,那为什么现在MD5被大家弃用了呢??一条信息的安全性取决于任何消息。摘要函数的目标是生成看起来随机的摘要。要被视为密码安全,散列函数应满足两个要求:1.攻击者不可能生成与特定散列值匹配的消息。2.攻击者不可能创建产生相同散列值的两条消息。根据IETF,MD5散列不再被视为一种加密安全方法,不应将其用于加密身份验证。2011年,IETF发布了RFC6151-LatestSecurityConsiderationsforMD5MessageDigestandHMAC-MD5Algorithm,其中引用了最近针对MD5哈希值的一些攻击。它提到一种攻击会在一分钟或更短时间内在标准笔记本电脑上产生哈希冲突,而另一种攻击会在2.6GHzPentium4系统上仅在10秒内产生一次冲突。因此,IETF建议新的协议设计根本不要使用MD5。最近对该算法的研究攻略:取消MD5在需要防冲突的应用中的使用,比如数字签名。当无意中重复消息哈希码时,这会导致消息冲突的可能性。MD5哈希码字符串也限制为128位。这使得它们比其他后来的哈希码算法更容易破解。因此,当人们发现这个算法不合适时,就开始放弃这个算法,逐渐衍生出其他比MD5更安全的算法。当时最早的验证还不是2011年,而是2004年通过王小云教授等国内学者的工作,证明md5可以进行碰撞攻击。也就是说,攻击者可以生成两个内容不同但哈希值完全相同的应用程序。这就导致了在大家眼里,MD5已经不再被认为是足够安全的数据了,所以MD5逐渐被大家淘汰,也没有那么多的使用了。为什么说MD5是不可逆的呢?我们简单的把A乘以B,肯定会得到一个固定的结果C。比如A(188923010)和B(172389945)但是如果你只给一个结果C,你知道C是那些计算出来的结果吗因素?相信你也猜不到。因此,结果只能从一个方向推导,不能从结果反推,称为不可逆单向函数,即Md5算法是不可逆的。更不用说,通过MD5复杂的算法计算得到的定长值。但是也有很多人说比较官方,就像百度直播中的一些大佬:MD5是不可逆的,因为它是一个散列函数(也叫散列函数,散列函数也叫散列函数,散列函数,它是一种单向密码系统,即从明文到密文的不可逆映射。只有加密过程,没有解密过程。散列函数可以改变任意长度的输入,得到固定长度的输出。这种固定-length输出称为原始消息的散列或消息映射。一个理想的散列函数可以针对不同的输入得到不同的输出,如果有两条不同的消息得到相同的散列值,那么我们称之为碰撞),使用散列算法,原文在计算过程中的一些信息是丢失的。一个MD5理论上可以对应多个原文,因为MD5有有限个原文和无限个原文。这样一来,我觉得如果面试官问了,肯定回答的不是很好。相反,最好先总结一下,然后再表达你的理解。你知道MD5吗?
