HMAC的JAVA实现和应用

HMAC的JAVA实现和应用

2023年7月27日发(作者:)

HMAC的JAVA实现和应⽤

1、简介:

  HMACSHA1 是从SHA1 哈希函数构造的⼀种键控哈希算法,被⽤作 HMAC(基于哈希的消息验证代码)。 此 HMAC 进程将密钥与消息数据混合,使⽤哈希函数对混合结果进⾏哈希计算,将所得哈希值与该密钥混合,然后再次应⽤哈希函数。 输出的哈希值长度为 160 位。

在发送⽅和接收⽅共享机密密钥的前提下,HMAC 可⽤于确定通过不安全信道发送的消息是否已被篡改。 发送⽅计算原始数据的哈希值,并将原始数据和哈希值放在⼀个消息中同时传送。 接收⽅重新计算所接收消息的哈希值,并检查计算所得的 HMAC 是否与传送的 HMAC 匹配。

因为更改消息和重新⽣成正确的哈希值需要密钥,所以对数据或哈希值的任何更改都会导致不匹配。 因此,如果原始的哈希值与计算得出的哈希值相匹配,则消息通过⾝份验证。

SHA-1(安全哈希算法,也称为 SHS、安全哈希标准)是由美国政府发布的⼀种加密哈希算法。 它将从任意长度的字符串⽣成 160 位的哈希值。

HMACSHA1 接受任何⼤⼩的密钥,并产⽣长度为 160 位的哈希序列。2、实现(Java版本):

1 import ; 2 import Key; 3 import KeySpec; 4

5 public class HMACSHA1 { 6

7 private static final String MAC_NAME = "HmacSHA1";

8 private static final String ENCODING = "UTF-8";

9

10 /*11 * 展⽰了⼀个⽣成指定算法密钥的过程 初始化HMAC密钥

12 * @return

13 * @throws Exception14 *

15 public static String initMacKey() throws Exception {16 //得到⼀个 指定算法密钥的密钥⽣成器17 KeyGenerator KeyGenerator keyGenerator =tance(MAC_NAME);

18 //⽣成⼀个密钥19 SecretKey secretKey =teKey();20 return null;21 }22 */23

24 /**

25 * 使⽤ HMAC-SHA1 签名⽅法对对encryptText进⾏签名

26 * @param encryptText 被签名的字符串

27 * @param encryptKey 密钥

28 * @return

29 * @throws Exception

30 */

31 public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception

32 {

33 byte[] data=es(ENCODING);34 //根据给定的字节数组构造⼀个密钥,第⼆参数指定⼀个密钥算法的名称35 SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);

36 //⽣成⼀个指定 Mac 算法 的 Mac 对象37 Mac mac = tance(MAC_NAME);

38 //⽤给定密钥初始化 Mac 对象39 (secretKey);

40

41 byte[] text = es(ENCODING);

42 //完成 Mac 操作

43 return l(text);

44 }

45 }

3、HMAC在YS开放平台的应⽤:(1)、第三⽅申请接⼊YS开放平台,获得⼀个授权ID和⼀个⽤于签名的密钥,YS平台后台会记录ID和密钥的关联关系。(2)、第三⽅平台在调⽤YS平台接⼝时,要求带上授权ID和对调⽤接⼝进⾏签名。(3)、YS平台通过授权ID获取到对应的密钥进⾏验签,如果通过则处理请求。(4)、YS平台允许第三⽅更新密钥。4、使⽤HMAC防伪造:攻击者截包然后进⾏重放是常见的攻击⼿法,使⽤HMAC能有效防⽌伪造⽤户⾝份进⾏攻击,过程如下:(1)、在签名参数中加⼊时间戳,并在接⼝调⽤中带上明⽂的时间戳。(2)、后台在接收到请求时验证时间戳和服务器的时间差,如果超过超过时间窗则不予以处理。由此可见,由于经过了签名,攻击者不能修改包括时间参数在内的任何参数,因此,最多只能在指定的时间窗⼝内对包未经修改地重放。。5、总结:  通信过程中常见的威胁有:篡改、伪造和泄密。  HMAC⼀种⽤来防篡改和防伪造的有效⼿段,但不是防泄密的⽅法,因此,包含了敏感数据的信息还是要经过加密才能传输。此外,对于极为敏感只能进⾏⼀次性操作的接⼝(⽐如转账),还应带上⼀次性的token做校验,避免攻击者在时间窗内的连续重放的恶意攻击,最简单的⽅式还是使⽤SSL,为防⽌SSL中间⼈攻击,如果可能的话,在建⽴链接的过程中还应主动校验服务器证书的有效性。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690462898a352863.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信