📅  最后修改于: 2023-12-03 14:42:16.093000             🧑  作者: Mango
在Java中,可以使用SHA-256哈希算法生成字符串的摘要(digest)。此外,还可以将结果转换为十六进制格式,方便显示和存储。
Java标准库中提供了MessageDigest类,可以方便地生成SHA-256消息摘要。以下是一个示例代码:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA256Demo {
public static void main(String[] args) throws NoSuchAlgorithmException {
String input = "hello world"; // 待计算摘要的字符串
MessageDigest md = MessageDigest.getInstance("SHA-256"); // 获取SHA-256的MessageDigest实例
byte[] digest = md.digest(input.getBytes()); // 计算摘要字节数组
}
}
MessageDigest.getInstance("SHA-256")
用于获取SHA-256算法的消息摘要对象;input.getBytes()
将字符串转为字节数组;md.digest(byte[] input)
所有摘要计算都可以使用该方法,参数为待计算摘要的字节数组,返回计算后的摘要字节数组。另外,还可以使用一些开源的Java哈希库,如Bouncy Castle、Apache Commons Codec等。它们提供了更方便的API,使用起来更简洁。
以Bouncy Castle为例,以下是一个示例代码:
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.util.encoders.Hex;
public class SHA256Demo {
public static void main(String[] args) {
String input = "hello world"; // 待计算摘要的字符串
SHA256Digest md = new SHA256Digest(); // 创建SHA-256的Digest对象
byte[] data = input.getBytes(); // 将字符串转为字节数组
md.update(data, 0, data.length); // 输入摘要数据
byte[] digest = new byte[md.getDigestSize()]; // 创建一个字节数组,用于存放摘要
md.doFinal(digest, 0); // 计算摘要
String result = new String(Hex.encode(digest)); // 字节数组转换为十六进制字符串
System.out.println(result);
}
}
org.bouncycastle.crypto.digests.SHA256Digest
提供了SHA-256哈希算法的实现类;md.update(byte[] in, int inOff, int len)
输入摘要数据;md.doFinal(byte[] out, int outOff)
计算摘要;org.bouncycastle.util.encoders.Hex
提供了字节数组和十六进制字符串相互转换的工具类。SHA-256摘要通常以字节数组的形式存储。如果要在屏幕上显示或存储摘要,可以将其转换为十六进制字符串。
以下是代码片段:
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA256Demo {
public static void main(String[] args) throws NoSuchAlgorithmException {
String input = "hello world"; // 待计算摘要的字符串
MessageDigest md = MessageDigest.getInstance("SHA-256"); // 获取SHA-256的MessageDigest实例
byte[] digest = md.digest(input.getBytes()); // 计算摘要字节数组
String result = new BigInteger(1, digest).toString(16); // 将字节数组转换为十六进制字符串
System.out.println(result);
}
}
new BigInteger(1, byte[] val)
用指定的字节数组构造一个BigIntger对象,其中1表示正数;BigInteger.toString(int radix)
将数字以指定的进制(此处为16)转换为字符串。