Java中的MD5哈希

2023/07/02

1. 概述

MD5是一种广泛使用的加密哈希函数,可生成128位的哈希值。

在本文中,我们将看到使用各种Java库创建MD5哈希的不同方法

2. MD5使用MessageDigest类

java.security.MessageDigest类中有哈希功能,这个想法是首先使用你想要用作参数的算法类型实例化MessageDigest:

MessageDigest.getInstance(String Algorithm)

然后使用update()函数继续更新消息摘要:

public void update(byte [] input)

当你正在读取一个长文件时,可以多次调用上面的函数。然后最后我们需要使用digest()函数来生成哈希码:

public byte[] digest()

下面是一个为密码生成哈希值然后验证它的示例:

@Test
public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";
        
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(password.getBytes());
    byte[] digest = md.digest();
    String myHash = DatatypeConverter.printHexBinary(digest).toUpperCase();
        
    assertThat(myHash.equals(hash)).isTrue();
}

同样,我们也可以验证一个文件的校验和:

@Test
public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException {
    String filename = "src/test/resources/test_md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";
        
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(Files.readAllBytes(Paths.get(filename)));
    byte[] digest = md.digest();
    String myChecksum = DatatypeConverter.printHexBinary(digest).toUpperCase();
        
    assertThat(myChecksum.equals(checksum)).isTrue();
}

我们需要注意,MessageDigest不是线程安全的。因此,我们应该为每个线程使用一个新实例。

3. MD5使用Apache Commons

org.apache.commons.codec.digest.DigestUtils类使事情变得简单得多。

让我们看一个哈希和验证密码的例子:

@Test
public void givenPassword_whenHashingUsingCommons_thenVerifying()  {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";

    String md5Hex = DigestUtils.md5Hex(password).toUpperCase();
        
    assertThat(md5Hex.equals(hash)).isTrue();
}

4. MD5使用Guava

下面是我们可以遵循的另一种使用com.google.common.io.Files.hash生成MD5校验和的方法:

@Test
public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException {
    String filename = "src/test/resources/test_md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";
        
    HashCode hash = com.google.common.io.Files.hash(new File(filename), Hashing.md5());
    String myChecksum = hash.toString().toUpperCase();
        
    assertThat(myChecksum.equals(checksum)).isTrue();
}

请注意,Hashing.md5已弃用。但是,正如官方文档所指出的那样,出于安全考虑,一般情况下建议不要使用MD5。这意味着如果我们需要与需要MD5的遗留系统集成,我们仍然可以使用此方法。否则,我们最好考虑更安全的选择,例如SHA-256

5. 总结

Java API和其他第三方API(如Apache commons和Guava)中有不同的方法来生成MD5哈希,根据项目的要求和项目需要遵循的依赖关系明智地选择。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章