摘要算法
md5
算法
MD5(Message-Digest Algorithm 5)是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
以下是MD5算法的一些基本特性:
- 固定长度输出:无论输入的信息长度如何,MD5都会生成一个固定长度的散列值(128位)。
- 不可逆性:从MD5散列值无法逆向推导出原始信息(除非使用暴力破解或彩虹表)。
尽管MD5在过去被广泛使用,但现在已经发现了一些针对MD5的碰撞(collision)攻击,即找到两个不同的输入,它们具有相同的MD5散列值。因此,MD5不再被认为是一个安全的散列函数,对于需要高度安全性的应用(如密码存储),建议使用更安全的算法,如SHA-256或SHA-3。
详细使用请参考 链接
md5
算法测试例子:
java
@Test
public void test() {
String randomStr = RandomStringUtils.random(1024);
String md5Str = DigestUtils.md5Hex(randomStr);
// md5算法固定输出为128位
Assert.assertEquals(32, md5Str.length());
}
SHA
算法
SHA(Secure Hash Algorithm)算法是一组密码学哈希函数,用于生成数据的固定长度哈希值,以确保数据的完整性和安全性。
SHA算法设计用于生成固定长度的哈希值,这些哈希值具有不可逆性、固定长度和唯一性等特点。SHA算法系列包括多个版本,如SHA-1、SHA-256、SHA-384和SHA-512等,它们的安全性随着哈希长度的增加而增强。
SHA算法特点
- 不可逆性:SHA算法是一种单向散列函数,从哈希值无法推导出原始输入数据。
- 固定长度:SHA算法生成的哈希值具有固定的长度,不受输入数据的长度影响。例如,SHA-256产生256位(32字节)的哈希值。
- 唯一性:理论上,不同的输入数据应该生成不同的哈希值,以确保哈希值的唯一性。然而,由于哈希碰撞的可能性,实际上存在不同的输入数据生成相同哈希值的情况,但这种情况非常罕见。
SHA算法版本
- SHA-1:产生160位(20字节)的哈希值,曾经广泛使用。但由于存在碰撞攻击漏洞,现已不再被推荐用于安全性要求高的场景。
- SHA-256:产生256位(32字节)的哈希值,是SHA系列中最常用的版本之一。它常用于数字签名、SSL证书等安全性要求较高的应用。
- SHA-384:产生384位(48字节)的哈希值,是SHA-256的扩展版本,提供更大的哈希长度。
- SHA-512:产生512位(64字节)的哈希值,也是SHA-256的扩展版本,为需要更高安全性的应用提供选择。
详细用法请参考 链接
SHA-256
算法测试例子:
java
@Test
public void testSHA256() throws NoSuchAlgorithmException {
String originText = RandomStringUtils.random(10 * 1024);
// 获取SHA-256 MessageDigest实例
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 更新原始数据
md.update(originText.getBytes(StandardCharsets.UTF_8));
// 完成哈希计算
byte[] digest = md.digest();
// 将结果转换为十六进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
// SHA-256固定输出256位
Assert.assertEquals(64, sb.length());
}