Java中的摘要算法MessageDigest
# MessageDigest
Java 的摘要算法在 java.security 包下 MessageDigest,通过 SPI 加载更多的摘要算法,这个包还提供了一些 Java 的权限检查,这里提一下摘要算法,用可以配合 Base64 或者 Hex 转化组合进行加密。 可以有 MD2、MD5、SHA-224、SHA-256、SHA-384、SHA-512 等等
# 例子
/**
* Java的摘要算法
*
* @author unclezs
* @since 2020/12/19 14:48
*/
@Slf4j
public class MessageDigestSample {
/**
* 常用的摘要算法
*/
public static final String DIGEST_MD2 = "MD2";
public static final String DIGEST_MD5 = "MD5";
public static final String DIGEST_SHA = "SHA";
public static final String DIGEST_SHA_224 = "SHA-224";
public static final String DIGEST_SHA_256 = "SHA-256";
public static final String DIGEST_SHA_384 = "SHA-384";
public static final String DIGEST_SHA_512 = "SHA-512";
public static void main(String[] args) {
String[] algorithms =
{DIGEST_MD2, DIGEST_MD5, DIGEST_SHA, DIGEST_SHA_224, DIGEST_SHA_256, DIGEST_SHA_384, DIGEST_SHA_512};
for (String algorithm : algorithms) {
try {
String original = "original";
String salt = "salt";
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.reset();
digest.update(salt.getBytes(StandardCharsets.UTF_8));
byte[] hashed = digest.digest(original.getBytes());
log.info("{}生成的摘要:{}", algorithm, Arrays.toString(hashed));
} catch (NoSuchAlgorithmException e) {
log.error("摘要算法不存在:{}", algorithm, e);
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 输出
# HMac
HMAC(Hash-based Message Authentication Code,散列消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特别计算方式之后产生的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。 HMAC 算法 是一种基于密钥的报文完整性的验证方法。HMAC 算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在 Hash 加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行 Hash 运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC 算法可以用来作加密、数字签名、报文验证等。
在 javax.crypto 包下提供了实现
# 示例
/**
* HmacSha256算法加密
* https://blog.csdn.net/sdnyqfyqf/article/details/105534376
*
* @author unclezs
* @since 2020/12/19 16:33
*/
@Slf4j
public class HmacSample {
public static void main(String[] args) {
log.info("HmacSHA256 加密后:{}",byHmacSha256("salt", "unclezs"));
}
private static byte[] byHmacSha256(String salt, String original) {
String hmacSha256 = "HmacSHA256";
try {
Mac mac = Mac.getInstance(hmacSha256);
SecretKey key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), hmacSha256);
mac.init(key);
return mac.doFinal(original.getBytes(StandardCharsets.UTF_8));
} catch (NoSuchAlgorithmException e) {
log.error("加密算法不存在:{}", hmacSha256, e);
} catch (InvalidKeyException e) {
log.error("非法私有key:{}", hmacSha256, e);
}
return new byte[0];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2020-12-19 16:45:20 [main] INFO com.unclezs.samples.java.encryption.HmacSample #main:23 - HmacSHA256 加密后:[3, 40, -93, -87, 70, 63, 79, 86, 31, 59, -1, -67, 115, -26, 76, -46, 31, 4, 35, -119, -112, -82, 43, -27, 97, -12, 76, 63, 115, -113, 41, 109]
1
在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11