信息摘要技术 - MAC系列
MAC算法综合了MD和SHA算法的特性,和MD、SHA算法类似,学名:密钥散列消息认证码,严格写法应该:Hmac-XXX
算法。MAC算法支持密钥
,因此不需要在使用salt
方式,
但是这里要注意密钥
不同于密码
,salt
更偏向于密码
,更容易使用,密钥
要经过特殊的构造,密钥
在不同算法里面是要不同长度/构造方法的要求的。
MAC算法家族发展历史
MAC算法是含有密钥
的散列算法,兼容MD和SHA算法,在此基础上添加了密钥支持,因此也被称为Hmac
算法,定义在RFC 2014
中,分为两大分支MD和SHA分支:
- MD分支:Hmac-MD2、Hmac-MD4、Hmac-MD5;
- SHA分支:Hmac-SHA1、Hmac-SHA256、Hmac-SHA384、Hmac-SHA512、Hmac-SHA224等;
应用场景
MAC算法应用场景也可用在MD和SHA场景下,不过其更多的被用在密钥交换上:
- AB双方公布
MAC
算法; - A公布密钥给B;
- A使用密钥对消息做摘要后,发送摘要给B;
- B收到消息,使用密钥对数据做摘要验证是否一致;
MAC的应用更类似现在的MD5 加 Salt方式,但是更安全。
Java中算法实现
算法 | 摘要长度(位) | 备注 |
---|---|---|
Hmac-MD5 | 128 | JDK 6提供 |
Hmac-SHA1 | 160 | JDK 6提供 |
Hmac-SHA256 | 256 | JDK 6提供 |
Hmac-SHA384 | 384 | JDK 6提供 |
Hmac-SHA512 | 512 | JDK 6提供 |
Hmac-MD2 | 128 | Bouncy Castle实现 |
Hmac-MD4 | 128 | Bouncy Castle实现 |
Hmac-SHA224 | 224 | Bouncy Castle实现 |
MAC算法的使用,使用MAC
类,MAC
类要求调用初始化init()
方法的时候设置一个密钥
,<b>这个密钥是有长度要求的</b>,大部分情况下使用KeyGenerator
类来产生,KeyGenerator
可以根据传入的算法,产生适合算法要求的密钥长度的秘钥
,示例代码如下:
public class MACTest {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
// 产生一个密钥,MAC的密钥加密时有一定长度要求,可以手动自己按照规定长度产生一个,但是不建议使用
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey = keyGen.generateKey();
byte[] key = secretKey.getEncoded();
// 接收方接受密钥后进行信息摘要
String input = "test";
SecretKey sKey = new SecretKeySpec(key, "HmacMD5");
Mac mac = Mac.getInstance("HmacMD5");
mac.init(sKey);
byte[] sData = mac.doFinal(input.getBytes());
System.out.println(new String(HexBin.encode(sData)));
}
}
网友评论