SHA简介
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
目前SHA有五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,也是美国的政府标准,后四者有时并称为SHA-2。
SHA家族特点
Sha-1 | Sha-224 | Sha-256 | Sha-384 | Sha-512 | |
---|---|---|---|---|---|
消息摘要长度 | 160 | 224 | 256 | 384 | 512 |
消息长度 | 264 | 264 | 264 | 264 | 2128 |
字长度 | 32 | 32 | 32 | 32 | 64 |
分组长度 | 512 | 512 | 512 | 1024 | 1024 |
步骤数 | 80 | 64 | 64 | 80 | 80 |
工具类
package com.dbl.util;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @Author 高国鹏
* @Create 2024/7/4 13:17
* Description: SHA 系列算法加密工具类
*/
public class SHAUtil {
private static final String SHA_1 = "SHA-1";
private static final String SHA_224 = "SHA-224";
private static final String SHA_256 = "SHA-256";
private static final String SHA_384 = "SHA-384";
private static final String SHA_512 = "SHA-512";
public static String getSHA1(String str, boolean uppercase) {
return getSHA(str, SHA_1, uppercase);
}
public static String getSHA224(String str, boolean uppercase) {
return getSHA(str, SHA_224, uppercase);
}
public static String getSHA256(String str, boolean uppercase) {
return getSHA(str, SHA_256, uppercase);
}
public static String getSHA384(String str, boolean uppercase) {
return getSHA(str, SHA_384, uppercase);
}
public static String getSHA512(String str, boolean uppercase) {
return getSHA(str, SHA_512, uppercase);
}
/**
* 利用Java原生摘要实现SHA加密(支持大小写,默认小写)
*
* @param str 要加密的数据
* @param algorithm 要使用的算法(SHA-1,SHA-2224,SHA-256,SHA-384,SHA-512)
* @param uppercase 是否转为大写
* @return
*/
private static String getSHA(String str, String algorithm, boolean uppercase) {
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
MessageDigest messageDigest;
try {
//获得SHA转换器
messageDigest = MessageDigest.getInstance(algorithm);
//bytes是输入字符串转换得到的字节数组
messageDigest.update(bytes);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA签名过程中出现错误,算法异常");
}
//转换并返回结果,也是字节数组,包含16个元素
byte[] digest = messageDigest.digest();
//字符数组转换成字符串返回
String result = byteArrayToHexString(digest);
//转换大写
return uppercase ? result.toUpperCase() : result;
}
/**
* 将字节数组转为16进制字符串
*
* @param bytes 要转换的字节数组
* @return
*/
private static String byteArrayToHexString(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
//java.lang.Integer.toHexString() 方法的参数是int(32位)类型,
//如果输入一个byte(8位)类型的数字,这个方法会把这个数字的高24为也看作有效位,就会出现错误
//如果使用& 0XFF操作,可以把高24位置0以避免这样错误
String temp = Integer.toHexString(b & 0xFF);
if (temp.length() == 1) {
//1得到一位的进行补0操作
builder.append("0");
}
builder.append(temp);
}
return builder.toString();
}
}
标签:String,uppercase,SHA,static,str,512,加密算法
From: https://www.cnblogs.com/Gguopeng/p/18413362