哈希算法是一种将任意长度的输入数据映射为固定长度的输出的算法。它是通过应用特定的哈希函数对输入数据进行计算,从而产生唯一的哈希值。它可以进行数据完整性校验、数据加密与安全、散列存储等。
常见的几种Hash算法有以下几种:
算法名称 | 输出长度(byte) | 算法特点 |
MD5 | 16 | 生成的结果长度固定,且相同的内容生成的结果不变,但不同的内容生成的结果大概率不相同(不排除产生哈希冲突的可能); 加密过程是单向的、不可逆的; hash算法具有高效性,可以很快计算出哈希值。 |
SHA-1 | 20 | |
SHA-256 | 32 | |
SHA-512 | 64 | |
RipeMD-160 | 20 | |
Hmac | 16 | 基于密钥实现,可以应对彩虹表攻击 |
不同的Hash算法它们的实现步骤几乎一致,只是生成的内容不同,以下我将叙述不同算法的相同实现步骤。
Hash算法的实现步骤具体分为以下三步:
1. 创建消息摘要对象;
2. 更新原始数据;
3. 获取消息摘要(加密结果)。
当完成主要的计算步骤后,将得到的字节数组转换成字符串,就会得到我们熟悉的hash值。
// 创建消息摘要对象
MessageDigest digest = MessageDigest.getInstance("使用的算法名称");
// 更新原始数据
digest.update(待加密内容.getBytes());
// 获取消息摘要
byte[] bytes = digest.digest();
// 将字节数组转换为16进制的字符串
StringBuilder ret = new StringBuilder();
for(byte b: bytes) {
// 将字节值转换为2位十进制的字符串
ret.append(String.format("%02x", b));
}
上述过程是直接生成哈希值的hash算法,但Hmac算法是基于密钥实现的,因此,它的实现步骤会区别于上述几个算法的步骤 。
Hmac的算法实现步骤:
① 生成密钥
② 使用密钥对内容加密
// 第一步 生成密钥
// 获取HmacMD5密钥生成器
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
// 生成密钥
SecretKey key = keyGen.generateKey();
// 第二步 加密
// 获取Hmac加密算法对象
Mac mac = Mac.getInstance("HmacMD5");
// 初始化密钥(更新前一定要初始化密钥)
mac.init(key);
// 更新原始加密内容
mac.update(password.getBytes());
// 加密处理并获得加密结果
byte[] bytes = mac.doFinal();
String result = HashTools.bytesToHex(bytes);
System.out.println("加密结果:" + result);