Java加密与解密的艺术-消息摘要算法

来源:互联网 发布:淘宝哪个店能寄到韩国 编辑:程序博客网 时间:2024/05/18 02:39

消息摘要算法包含MD、SHA、MAC共3大系列,常用于验证数据的完整性,是数字签名算法的核心算法。

equals方法比较的是两个对象的散列值,即比较两个对象的hashCode()方法的值是否相同,这说明hashCode可以作为辨别对象的唯一标示。

为了方便人们识别和阅读,数字指纹常以十六进制字符串的形式出现。

这也是为什么当山东大学王小云教授使用碰撞算法破解了MD5和SHA算法后,使得数字签名在理论上被伪造成为可能。

消息摘要算法又被称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可能通过该散列值反推其原始信息。这是消息摘要算法的安全性的根本所在。

MD2算法首先对信息进行数据补位,使信息的字节长度是16的倍数。再以一个16位的检验和check-sum作为补充信息追加到原信息的末尾。

MD5算法暴漏出的漏洞越来越多,MD5算法已不再适合安全要求较高的场合使用。

为了提高安全性,往往将一些其他的不可变信息,如用户名、Email地址加入原始密码中,使得密码破译的难度加大。其中将不可变信息成为’盐Salt’.而这种处理方式被称为’加盐处理’.

消息摘要的主要特点就是对同一段数据做多次摘要处理后,其摘要值完全一致。

Bouncy Castle是对SUN的友善补充,提供了对MD4算法的支持。支持十六进制字符串形式的摘要信息。

Commons Codec支持多种形式的参数,支持十六进制字符串形式的摘要信息。

如果只要求MD5算法支持,Commons Codec是首选,若要支持MD2或MD4算法,或者要求在此基础上获得十六进制编码结果,就让Sun和Bouncy Castle联姻。

SHA与MD算法不同之处主要在于摘要长度,SHA算法的摘要更长,安全性更高。
与MD系列算法不同的是:若输入的消息不同,则与其对应的摘要信息的差异概率很高。
1-有消息摘要反推原输入信息,从计算理论上来说是很困难的。
2-想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的概率导致其产生的消息摘要迥异。

Commons Codec与Sun所提供的SHA算法实现在本质上毫无差别。

SHA系列算法比MD系列算法更有优势,MD系列算法仅有128位,而SHA算法则可以从160位扩充到512位,更具安全性。

Sun:由于Sun提供了较为底层的SHA算法实现,如SHA1,SHA-256,SHA-384和SHA-512四种算法,但缺少了对应的进制转换实现,多少有些遗憾。

BouncyCastle:BouncyCatle是对Sun的友善补充,提供了对SHA-224算法的支持,支持十六进制字符串形式的摘要信息,相当方便。

Commons Codec:Commons Codec对Sun提供的SHA算法做了包装,支持多种形式的参数,支持十六进制字符串形式的摘要信息,相当方便。

MAC(Message Authentication Code消息认证算法)是含有密钥的散列函数算法,兼容MD和SHA算法的特性,并在此基础上加入了密钥。

MD系列算法有HmacMD2,HmacMD4和HmacMD5三种算法;SHA系列算法有HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384和HmacSHA512五种算法。
经MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的算法摘要值长度相同。HmacSHA1算法得到的摘要长度就是SHA1算法得到的密钥长度。

MD5和SHA算法常作为数字证书的签名算法,而SHA算法则更为常见一些。

OpenSSL提供了MD5,SHA等消息摘要算法实现,且算法实现与Java实现完全一致,两者所构建的系统,在加密算法实现上可保持一致性。
代码参见github:
https://github.com/DISSIDIA-986/EncDecAboutJava

0 0
原创粉丝点击