Java 中字符串的 SHA-1 摘要的十六進製表示
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 算法對其進行初始化。然後,我們使用輸入調用MessageDigest
上的update()
方法,並將輸入轉換為byte
。接下來,我們創建一個byte[]
類型的新變量digest
。該變量保存添加到MessageDigest
對象的數據的加密哈希值。
此外,我們循環遍歷digest
數組中的字節並將每個字節附加到hexString.
String.format()
方法有助於將字節值格式化為十六進製字符串。
最後,我們斷言輸入等於預期的十六進制值。
4. 使用 Apache Commons 編解碼器
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.使用谷歌番石榴
Guava 是 Google 開發的一個庫。它提供了一個哈希類,可用於生成 SHA-1 摘要的十六進製表示形式。
要使用這個庫,我們需要將其依賴項添加到pom.xml
:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-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 哈希值。然後,我們斷言輸出等於預期結果。
六,結論
在本文中,我們學習了在 Java 中生成字符串 SHA-1 摘要的十六進製表示的三種不同方法。內置的MessageDigest
類不需要額外的依賴項。另外,Apache Commons Codec庫和Guava庫使用起來也更加方便。
與往常一樣,示例的完整源代碼可在 GitHub 上獲取。