1. 概述

在软件工程中,确保数据完整性和安全性至关重要。一个简便的方法是通过使用加密哈希函数,如安全散列算法1(SHA-1),它常用于校验和和数据完整性验证。

本教程将探讨如何使用Java通过三种方法生成字符串的SHA-1哈希值的十六进制(hex)表示。

2. 示例设置

在这个教程中,我们将生成一个示例输入的SHA-1散列值的十六进制表示,并与预期输出进行比较:

String input = "Hello, World";
String expectedHexValue= "907d14fb3af2b0d4f18c2d46abe8aedce17367bd";

3. 使用MessageDigest

MessageDigest是Java内置类,属于java.security包,它提供了一种方便的方式来生成字符串的SHA-1散列值。

以下是使用MessageDigest生成十六进制SHA-1散列值的示例代码:

@Test
void givenMessageDigest_whenUpdatingWithData_thenDigestShouldMatchExpectedValue() throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    md.update(input.getBytes(StandardCharsets.UTF_8));
    byte[] digest = md.digest();
        
    StringBuilder hexString = new StringBuilder();
        
    for (byte b : digest) {
        hexString.append(String.format("%02x", b));
    }

    assertEquals(expectedHexValue, hexString.toString());
}

首先,我们创建MessageDigest的新实例并使用SHA-1算法初始化。然后,我们将输入转换为字节并调用MessageDigestupdate()方法。接着,我们创建一个byte[]类型的变量digest,用于存储添加到MessageDigest对象的数据的加密哈希值。

此外,我们遍历digest数组并将每个字节追加到hexString中。String.format()方法有助于将字节值格式化为十六进制字符串。

最后,我们断言输入等于预期的十六进制值。

4. 使用Apache Commons Codec

Apache Commons Codec库提供了一个名为DigestUtils的类,简化了生成SHA-1散列值十六进制表示的过程

要使用此库,我们需要将其依赖项添加到pom.xml

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

接下来,让我们看看如何使用DigestUtils类:

@Test
void givenDigestUtils_whenCalculatingSHA1Hex_thenDigestShouldMatchExpectedValue() {
    assertEquals(expectedHexValue, DigestUtils.sha1Hex(input));
}

在这里,我们调用DigestUtils类的sha1Hex()方法。该方法计算字符串的SHA-1散列值并返回结果作为十六进制。同时,我们也检查输入是否等于预期的十六进制值。

5. 使用Google Guava

由Google开发的Guava库提供了一个可以用来生成SHA-1散列值十六进制表示的哈希类

要使用这个库,我们需要将其依赖项添加到pom.xml

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>33.0.0-jre</version>
</dependency>

现在来看看如何使用Guava库:

@Test
void givenHashingLibrary_whenCalculatingSHA1Hash_thenDigestShouldMatchExpectedValue() {
    assertEquals(expectedHexValue, Hashing.sha1().hashString(input, StandardCharsets.UTF_8).toString());
}

在上面的示例代码中,我们在Hashing类上调用sha1()方法,使用UTF-8字符编码计算SHA-1散列。然后,我们断言输出等于预期的结果。

6. 总结

在这篇文章中,我们学习了三种不同的Java方法来生成字符串的SHA-1散列值的十六进制表示。内置的MessageDigest类无需额外依赖。而Apache Commons Codec库和Guava库则提供了更便捷的使用方式。

如往常一样,所有示例代码的完整源代码可以在GitHub上找到。