Java中的SHA-256和SHA3-256哈希

SHA-256 and SHA3-256 Hashing in Java

1.概述

SHA(安全哈希算法)是流行的加密哈希函数之一。可以使用加密哈希来为文本或数据文件签名。在本教程中,让我们看一下如何使用各种Java库执行SHA-256和SHA3-256哈希操作。

SHA-256算法生成几乎唯一的固定大小的256位(32字节)哈希。这是一种单向功能,因此无法将结果解密回原始值。

当前,SHA-2哈希被广泛使用,因为它被认为是加密领域中最安全的哈希算法。

SHA-3是SHA-2之后的最新安全哈希标准。与SHA-2相比,SHA-3提供了一种生成唯一的单向哈希的不同方法,并且在某些硬件实现中可以更快。与SHA-256相似,SHA3-256是SHA-3中的256位固定长度算法。

NIST在2015年发布了SHA-3,因此暂时没有SHA-2的SHA-3库那么多。直到JDK 9内置默认提供程序中都提供了SHA-3算法。

现在,让我们从SHA-256开始。

进一步阅读:

使用Java-LSH在Java中进行局部性哈希处理

Java中的MD5哈希

Java HashSet指南

2. Java中的MessageDigest类

Java为SHA-256哈希提供了内置的MessageDigest类:

1
2
3
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));

但是,这里我们必须使用自定义字节到十六进制转换器来获取十六进制的哈希值:

1
2
3
4
5
6
7
8
9
private static String bytesToHex(byte[] hash) {
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < hash.length; i++) {
    String hex = Integer.toHexString(0xff & hash[i]);
    if(hex.length() == 1) hexString.append('0');
        hexString.append(hex);
    }
    return hexString.toString();
}

3.番石榴图书馆

Google Guava库还提供了一个用于哈希的实用程序类。

首先,让我们定义依赖关系:

1
2
3
4
5
<dependency>
    <groupId>com.google.guava</groupId>
    guava</artifactId>
    <version>20.0</version>
</dependency>

现在,这是我们可以使用Guava哈希字符串的方法:

1
2
3
String sha256hex = Hashing.sha256()
  .hashString(originalString, StandardCharsets.UTF_8)
  .toString();

4. Apache Commons编解码器

同样,我们也可以使用Apache Commons Codecs:

1
2
3
4
5
<dependency>
    <groupId>commons-codec</groupId>
    commons-codec</artifactId>
    <version>1.11</version>
</dependency>

这是实用程序类,称为DigestUtils,它支持SHA-256哈希:

1
String sha256hex = DigestUtils.sha256Hex(originalString);

5.充气城堡图书馆

5.1。 Maven依赖

1
2
3
4
5
<dependency>
    <groupId>org.bouncycastle</groupId>
    bcprov-jdk15on</artifactId>
    <version>1.60</version>
</dependency>

5.2。使用Bouncy Castle库散列

Bouncy Castle API提供了一个实用程序类,用于将十六进制数据转换为字节然后再次转换。

但是,需要先使用内置Java API填充摘要:

1
2
3
4
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha256hex = new String(Hex.encode(hash));

6. SHA3-256

现在让我们继续使用SHA3-256。 Java中的SHA3-256哈希与SHA-256并没有什么不同。

6.1。Java中的MessageDigest类

从JDK 9开始,我们可以简单地使用内置的SHA3-256算法:

1
2
3
4
final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
final byte[] hashbytes = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(hashbytes);

6.2.Apache Commons编解码器

Apache Commons Codecs为MessageDigest类提供了一个方便的DigestUtils包装器。从1.11版开始,该库开始支持SHA3-256,它也需要JDK 9+:

1
String sha3_256hex = new DigestUtils(SHA3_256).digestAsHex(originalString);

6.3。凯卡克256

Keccak-256是另一种流行的SHA3-256哈希算法。当前,它可以替代标准的SHA3-256。 Keccak-256提供与标准SHA3-256相同的安全级别,并且仅在填充规则上与SHA3-256不同。它已在Monoro等多个区块链项目中使用。

同样,我们需要导入Bouncy Castle Library以使用Keccak-256哈希:

1
2
3
4
5
Security.addProvider(new BouncyCastleProvider());
final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
final byte[] encodedhash = digest.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = bytesToHex(encodedhash);

我们还可以使用Bouncy Castle API进行哈希处理:

1
2
3
4
Keccak.Digest256 digest256 = new Keccak.Digest256();
byte[] hashbytes = digest256.digest(
  originalString.getBytes(StandardCharsets.UTF_8));
String sha3_256hex = new String(Hex.encode(hashbytes));

7.结论

在这篇快速文章中,我们了解了使用内置库和第三方库在Java中实现SHA-256和SHA3-256哈希的几种方法。

上面示例的源代码可以在GitHub项目上找到。