信息摘要算法很多,主要的MD、MAC、SHA算法很常用,但是还有一些其他信息摘要算法,这些摘要算法JDK都没有提供。
RipeMD
1996年提出,在分析MD4、MD5的缺陷基础上做的改进算法,有4个标准和2个融合产物,区别是产生的摘要长度区别。
- RipeMD128,产生128位摘要信息;
- RipeMD160,产生160位摘要信息;
- RipeMD256,产生256位摘要信息;
- RipeMD320,产生320位摘要信息;
- HmacRipeMD128,与MAC算法融合产物,产生128位摘要信息;
- HmacRipeMD160,与MAC算法融合产物,产生160位摘要信息;
Tiger
1995年提出,号称是最快的Hash算法,专门为64为机器做了优化,信息摘要长度为192位。
Whirlpool
目前已被ISO标准采纳,是最安全的信息摘要算法。历史上有三个版本,最新的是2003年版本,产生的摘要长度在512位。
CRC算法
CRC算法并不是属于加密算法范畴,和“奇偶校验码”、“循环冗余校验码”是一套内容,CRC是循环冗余校验码,是一个产生简短固定位数的散列函数。CRC算法是信息摘要算法的前身,为信息摘要算法奠定了基础
主要用途:校验数据输出/保存后的错误内容。
一般用法:在计算后附件到原数据中,使用数据前,对数据的完整性做校验。
常见场景:WinRAR这类数据压缩软件,防止数据压缩文件错误。
CRC算法也分为很多类:
- CRC-1:主要用于硬件,也就是常说的奇偶校验码;
- CRC-32:主要在通信领域实现差错控制,IEEE 802.3只是CRC-32中的一种实现;
- CRC-32-Adler:CRC-32的变种,速度比CRC-32块,常用在zlib压缩算法中;
- CRC-128:演变为MD算法。
- CRC-160:演变为SHA算法。
Java算法实现
Java没有实现以上算法(除CRC-32和Adler-32算法外),可以使用Bouncy Castle的算法实现。下面是CRC-32算法的使用示例:
public class CRCTest{
public static void main(String[] args) throws Exception{
String input = "test";
CRC32 crc32 = new CRC32();
crc32.update(input.getBytes());
String hex = Long.toHexString(crc32.getValue());
System.out.println(hex);
}
}