SHA
2024年11月11日约 640 字大约 2 分钟
2.2 SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,
是FIPS所认证的安全散列算法。 能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。
且若输入的消息不同,它们对应到不同字符串的机率很高。
目前SHA有五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,
由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,也是美国的政府标准,后四者有时并称为SHA-2。
SHA-1也是一种哈希算法,它的输出是160 bits,即20字节。
SHA家族
SHA家族各个参数对比如下:
代码样例
SHA-1
20 bytes
private static void sha1() throws Exception {
String[] input = {"Hello", "World"};
// 创建一个MessageDigest实例:
MessageDigest md = MessageDigest.getInstance("SHA-1");
// 反复调用update输入数据
for (String s : input) {
md.update(s.getBytes("UTF-8"));
}
byte[] result = md.digest();
// 20 bytes
Preconditions.checkArgument(result.length == 20, "不符合期望");
String rs = HexFormat.of().formatHex(result);
System.out.println(rs);
Preconditions.checkArgument(
StringUtils.equals(rs, "db8ac1c259eb89d4a131b253bacfca5f319d54f2"), "不符合期望");
}
SHA-224
224 / 8 = 28 bytes
private static void sha224() throws Exception {
// 注册BouncyCastle.
Security.addProvider(new BouncyCastleProvider());
String[] input = {"Hello", "World"};
// 创建一个MessageDigest实例
MessageDigest md = MessageDigest.getInstance("SHA-224");
// 反复调用update输入数据
for (String s : input) {
md.update(s.getBytes("UTF-8"));
}
byte[] result = md.digest();
// 224 / 8 = 28 bytes
Preconditions.checkArgument(result.length == 28, "不符合期望");
String rs = HexFormat.of().formatHex(result);
System.out.println(rs);
Preconditions.checkArgument(
StringUtils.equals(rs, "b07a0b24d54879214f2361e0a1ac320442fa4e53a0f607d126fbfb8a"), "不符合期望");
}
SHA-256
256/8 = 32 bytes
private static void sha256() throws Exception {
String[] input = {"Hello", "World"};
// 创建一个MessageDigest实例:
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 反复调用update输入数据
for (String s : input) {
md.update(s.getBytes("UTF-8"));
}
byte[] result = md.digest();
// 32 bytes
Preconditions.checkArgument(result.length == 32, "不符合期望");
String rs = HexFormat.of().formatHex(result);
System.out.println(rs);
Preconditions.checkArgument(
StringUtils.equals(rs, "872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4"), "不符合期望");
}
SHA-384
384/8 = 48 bytes
private static void sha384() throws Exception {
String[] input = {"Hello", "World"};
// 创建一个MessageDigest实例:
MessageDigest md = MessageDigest.getInstance("SHA-384");
// 反复调用update输入数据
for (String s : input) {
md.update(s.getBytes("UTF-8"));
}
byte[] result = md.digest();
// 48 bytes
Preconditions.checkArgument(result.length == 48, "不符合期望");
String rs = HexFormat.of().formatHex(result);
System.out.println(rs);
Preconditions.checkArgument(
StringUtils.equals(rs, "293cd96eb25228a6fb09bfa86b9148ab69940e68903cbc0527a4fb150eec1ebe0f1ffce0bc5e3df312377e0a68f1950a"), "不符合期望");
}
SHA-512
512/8 = 64 bytes
private static void sha512() throws Exception {
String[] input = {"Hello", "World"};
// 创建一个MessageDigest实例:
MessageDigest md = MessageDigest.getInstance("SHA-512");
// 反复调用update输入数据
for (String s : input) {
md.update(s.getBytes("UTF-8"));
}
byte[] result = md.digest();
// 64 bytes
Preconditions.checkArgument(result.length == 64, "不符合期望");
String rs = HexFormat.of().formatHex(result);
System.out.println(rs);
Preconditions.checkArgument(
StringUtils.equals(rs, "8ae6ae71a75d3fb2e0225deeb004faf95d816a0a58093eb4cb5a3aa0f197050d7a4dc0a2d5c6fbae5fb5b0d536a0a9e6b686369fa57a027687c3630321547596"), "不符合期望");
}
CryptoJS
return CryptoJS.SHA256('a12345678');
return CryptoJS.SHA384('a12345678');
return CryptoJS.SHA512('a12345678');