Author:赵志乾
Date:2024-07-29
Declaration:All Right Reserved!!!
1. 简介
SHA-256(Secure Hash Algorithm 256-bit)是一种广泛使用的密码学哈希函数,其能够将任意长度的数据转换成固定长度(256位,即32字节)的哈希值,通常以64个十六进制数的形式呈现。该算法因高安全性和广泛的应用领域而备受推崇,工作原理如下:
- 数据预处理:将原始数据转换为位字符串,并进行填充(先在数据末尾添加一个1,然后填足够的0),确保数据长度对512取模后的余数位448,之后在数据末尾附加一个64位的表示原始数据长度的二进制数;
- 分组处理:将预处理后的数据分为多个512位的分组,对每个分组进行一系列处理;
- 哈希值生成:通过一系列迭代和压缩操作,逐步生成最终的256位哈希值;
2. 代码示例
public static String generateSHA256(String input) {
try {
// 创建一个MessageDigest实例,初始化为SHA-256算法对象
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 使用指定的字节更新摘要,这里需要指定字符集编码,默认为平台默认字符集
md.update(input.getBytes(StandardCharsets.UTF_8));
// 完成哈希计算,得到结果
byte[] digest = md.digest();
// 将得到的字节转换成十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : digest) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
3. 应用场景
SHA-256可用于数据防篡改,若对数据增加密钥后再做运算,可近似起到数字签名效果。代码如下:
public static void main(String[] args) {
String key = "密钥";
String originalString = "原始数据串";
String sign= "你预期的SHA-256哈希值";
// step1: 增加第三方位置的密钥
originalString += key;
// step2: 字符串的SHA-256哈希值
String calculatedSHA256 = generateSHA256(originalString);
// step3: 进行验签
if (calculatedSHA256.equals(sign)) {
System.out.println("验签成功,数据未被篡改");
} else {
System.out.println("验签失败,数据可能被篡改");
}
}