网站建设所需要软件,做行业网站,创建app与网站的区别,浙江百度推广开户hi#xff0c;大家好#xff0c;今天我们开始介绍消息摘要算法中的HMAC#xff08;Keyed-Hashing for Message Authentication#xff09;消息认证码算法#xff0c;MAC#xff08;Message Authentication Code#xff0c;消息认证码算法#xff09;是含有密钥散列函数…hi大家好今天我们开始介绍消息摘要算法中的HMACKeyed-Hashing for Message Authentication消息认证码算法MACMessage 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实现方HmacMD5128JDK、Bouncy Castle、Commons CodecHmacSHA1160JDK、Bouncy Castle、Commons CodecHmacSHA224224JDK、Bouncy Castle、Commons CodecHmacSHA256256JDK、Bouncy Castle、Commons CodecHmacSHA384384JDK、Bouncy Castle、Commons CodecHmacSHA512512JDK、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 key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {try {// 1、还原密钥SecretKey secretKey new SecretKeySpec(key, algorithm);// 2、创建MAC对象Mac mac Mac.getInstance(algorithm);// 3、设置密钥mac.init(secretKey);// 4、数据加密byte[] bytes mac.doFinal(data);// 5、生成数据String rs encodeHex(bytes);// 6、返回十六进制加密数据return rs;} catch (Exception e) {throw new RuntimeException(e);}
}Bouncy Castle 的HMAC 算法实现
Bouncy Castle 关于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 key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {HMac hmac generateHmacByAlgorithm(algorithm);KeyParameter keyParameter new KeyParameter(key);hmac.init(keyParameter);hmac.update(data, 0, data.length);byte[] rsData new byte[hmac.getMacSize()];hmac.doFinal(rsData, 0);return Hex.toHexString(rsData);
}Commons Codec 的HMAC 算法实现
Commons Codec 提供的 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 key;} catch (Exception e) {throw new RuntimeException(e);}
}// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {Mac mac HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_MD5, key);return Hex.encodeHexString(mac.doFinal(data));
}获取完整代码请访问 https://github.com/ForTheDevelopers/JavaSecurity HMAC 算法的应用
1、可以验证对端用户的合法性
HMAC算法的一个典型应用是用在“挑战/响应”Challenge/Response身份认证中认证流程如下
(1) 先由客户端向服务器发出一个验证请求假设是浏览器的GET请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端此为挑战。
(3) 客户端将收到的随机数与自己的密钥进行HMAC运算并得到一个结果作为认证证据返回给服务器此为响应。
(4) 与此同时服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC运算如果服务器的运算结果与客户端传回的响应结果相同则认为客户端是一个合法用户 。
在这个过程中可能遭到安全攻击的是服务器发送的随机数和客户端返回的HMAC结果而对于截获了这两个值的黑客而言这两个值是没有意义的随机值的引入使HMAC只在当前会话中有效大大增强了安全性和实用性。
2、发消息给对方或从对方接收消息
比如你和对方共享了一个密钥K现在你要发消息给对方既要保证消息没有被篡改完整性又要能证明信息确实是你本人发的源认证那么就把原信息和密钥K经 HMAC 计算的值一起发过去。对方接到之后使用自己手中的密钥K和原消息计算一下HMAC的值如果和你发送的HMAC一致那么可以认为这个消息既没有被篡改也没有冒充。
普通散列算法和HMAC算法的区别
普通散列算法就是通过hash对要输出的数据进行摘要接收到数据时再同样对源数据进行散列与给定的散列值比较看收到的数据与计算的hash值是否一致就可以了。
通常来说传输的数据和散列值是不同的渠道给出的比如网页上显示MD5或SHA的散列值但是下载链接是某个镜像网站的这并不影响你下载到的文件的正确性。
如果要通过同一个渠道发送数据和散列值的话比如消息认证码就要考虑数据和散列值是否会同时被篡改的问题如果第三方修改了数据然后进行MD5散列并一块发给接收方接收方并不能察觉到数据被篡改。
而HMAC算法就可以用一把发送方和接收方都有的密钥key进行计算而没有这个密钥key的第三方是无法计算出正确的散列值的这样就可以防止数据的来源方被篡改。
总结
HMAC算法目前的应用场景相对还比较少通常会直接使用加密算法来保证来源方的正确性不过HMAC在特定场景下还是有一定用途的大家可以根据自己的业务特点来选择使用哪种加密算法。另外也欢迎大家关注我们的公众号回复【加解密】获取本系列的全部源码。
创作不易如果大家喜欢本文欢迎点赞转发你的关注是我们继续前进的动力_
欢迎大家关注「我是开发者FTD」公众号微信号ForTheDevelopers
也欢迎大家添加我的个人微信交流微信号ForTheDeveloper
关注开发更关注开发者