hi,大家好,今天我们开始介绍消息摘要算法中的HMAC(Keyed-Hashing for Message Authentication)消息认证码算法,MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥,因此MAC算法也经常被称作 HMAC 算法。
MAC
在开始之前,我们先说下MAC算法。在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而 MAC(message authentication code) 就是一种常用的方法。
消息认证码是对消息进行认证并确认其完整性的技术。通过使用发送者和接收者之间共享的密钥,就可以识别出是否存在伪装和篡改行为。
MAC 是通过【MAC 算法 + 密钥 + 要加密的信息】三个要素一起计算得出的。
同hash算法(消息摘要)相比,消息摘要只能保证消息的完整性,即该消息摘要B是这个消息A生成的。而MAC算法能够保证消息的正确性,即判断确实发的是消息A而不是消息C。
同公私钥体系相比,因为MAC的密钥在发送方和接收方是一样的,所以发送方和接收方都可以来生成MAC,而公私钥体系因为将公钥和私钥分开,所以增加了不可抵赖性。
MAC有很多实现方式,比较通用的是基于hash算法的MAC,比如今天我们要讲的HMAC算法。还有一种是基于分组密码的实现,比如OMAC, CBC-MAC and PMAC等。
HMAC
HMAC 算法首先它是基于信息摘要算法的。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。
HMAC 算法除了需要信息摘要算法外,还需要一个密钥。HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。
MD 算法的对比
算法 | 摘要长度(bit) | 实现方 |
---|---|---|
HmacMD5 | 128 | JDK、Bouncy Castle、Commons Codec |
HmacSHA1 | 160 | JDK、Bouncy Castle、Commons Codec |
HmacSHA224 | 224 | JDK、Bouncy Castle、Commons Codec |
HmacSHA256 | 256 | JDK、Bouncy Castle、Commons Codec |
HmacSHA384 | 384 | JDK、Bouncy Castle、Commons Codec |
HmacSHA512 | 512 | JDK、Bouncy Castle、Commons Codec |
HMAC 算法实现
JDK 的 HMAC 算法实现
JDK 关于HMAC算法的实现:
// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {
try {
// 1、创建密钥生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
// 2、产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 3、获取密钥
byte[] key = secretKey.getEncoded();
// 4、返回密钥
return