6.8 小结

对于数据完整性的验证,可能是每一个计算机用户所关心的事情。这好比是自己在菜市场上买了菜要验分量。但如何来验证数据是否完整,而且是快速准确地验证数据的完整性又是一个麻烦的问题,这需要一种算法。

消息摘要算法就是这样一种专门用于验证数据完整性的算法。它源于CRC冗余校验算法,派生出MD和SHA两大系列消息算法,并在此基础上衍生出MAC算法。消息摘要算法是数字签名算法的基础。

几乎每一种消息摘要算法都有大概三种实现方式:Sun、Bouncy Castle和Commons Codec。Sun提供了最基本的算法实现;Bouncy Castle在Sun的基础上做了扩展,实现了Sun未能提供的算法;Commons Codec在Sun的基础上,对其方法做了封装,使其易用性提高,方便使用。

MD算法家族拥有MD2、MD4和MD5三种常用算法。在Java 6中,通过MessageDigest类可提供MD2和MD5两种算法支持;通过Bouncy Castle扩展,可提供MD4算法支持;Commons Codec则直接强化了MD5算法使用的便利性。如果考虑MD4算法的支持,则使用BouncyCastle;如果考虑方法的易用性,则使用Commons Codec更为恰当。

虽然MD5算法的破解使其安全性大为降低,但在用户注册/登录模块中仍然是架构师首选的方案。各大软件厂商在其软件下载页面上仍然使用MD5算法作为数据完整性验证的首选方法。MD5算法常作为安全性要求不高的环境中的常用算法。MD4和MD5算法为后续消息摘要算法(如SHA)的设计提供了参考。

SHA算法家族枝繁叶茂,拥有SHA-1、SHA-224、SHA-256、SHA-384和SHA-512五种常用算法。其中,后四种算法是在原有SHA-1基础上扩展了消息摘要长度,通常也称为SHA-2算法。在Java 6中,通过MessageDigest类可提供SHA-1、SHA-256、SHA-384和SHA-512四种算法支持;通过Bouncy Castle扩展,可提供SHA-224算法支持;Commons Codec则强化了SHA-1、SHA-256、SHA-384和SHA-512四种算法相应方法的易用性。如果不要求使用SHA-224算法,使用Commons Codec更方便。

SHA算法较之MD算法更为安全,常常出现在一些安全系数要求较高的环境中。一般的用户注册/登录模块,各大软件厂商用于校验数据完整性的页面中都常常用到SHA算法。这些领域既是MD5算法出没的地方,也是SHA算法盘踞之处。除此之外,MD5和SHA算法还常常作为数字证书的签名算法,而SHA算法则更为常见一些。

MAC是一种基于密钥的散列函数算法,它吸收了MD算法和SHA算法的精髓,并将其发扬光大,包含HmacMD2、HmacMD4和HmacMD5三种MD系列算法,HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384和HmacSHA512五种SHA系列算法。在Java 6中,通过Mac类可以提供HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512五种算法支持;通过Bouncy Castle扩展,可提供HmacMD2、HmacMD4和HmacSHA224三种算法支持。如果你想让你的系统更强劲,使用Bouncy Castle就是最好的选择。

虽然已经有了主流的消息摘要算法实现,但仍可能不能满足我们的需要。非主流消息摘要算法RipeMD系列(括含RipeMD128、RipeMD160、RipeMD256和RipeMD320)、Tiger、Whirlpool和GOST3411算法,以及HmacRipeMD系列(包括HmacRipeMD128和HmacRipeMD160)算法,可通过Bouncy Castle完成实现。

MD、SHA和MAC都是加密算法领域的消息摘要算法,与之功能相近的CRC-32算法则是最为古老的数据完整性验证算法。目前,CRC-32算法仍广泛用于通信领域,实现差错控制,其变种Adler-32算法则广泛适用于zlib压缩算法中。