Skip to content

摘要算法

md5算法

MD5(Message-Digest Algorithm 5)是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

以下是MD5算法的一些基本特性:

  1. 固定长度输出:无论输入的信息长度如何,MD5都会生成一个固定长度的散列值(128位)。
  2. 不可逆性:从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算法特点

  1. 不可逆性:SHA算法是一种单向散列函数,从哈希值无法推导出原始输入数据。
  2. 固定长度:SHA算法生成的哈希值具有固定的长度,不受输入数据的长度影响。例如,SHA-256产生256位(32字节)的哈希值。
  3. 唯一性:理论上,不同的输入数据应该生成不同的哈希值,以确保哈希值的唯一性。然而,由于哈希碰撞的可能性,实际上存在不同的输入数据生成相同哈希值的情况,但这种情况非常罕见。

SHA算法版本

  1. SHA-1:产生160位(20字节)的哈希值,曾经广泛使用。但由于存在碰撞攻击漏洞,现已不再被推荐用于安全性要求高的场景。
  2. SHA-256:产生256位(32字节)的哈希值,是SHA系列中最常用的版本之一。它常用于数字签名、SSL证书等安全性要求较高的应用。
  3. SHA-384:产生384位(48字节)的哈希值,是SHA-256的扩展版本,提供更大的哈希长度。
  4. 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());
}