奇妙的安全旅行之HMAC算法

HMAC(消息认证码)是基于密钥的散列函数,用于确保信息的完整性和来源的正确性。本文介绍了MAC的概念,HMAC的原理,对比了HMAC与普通散列算法的区别,并展示了在Java中实现HMAC的不同方式,包括JDK、Bouncy Castle和Commons Codec。HMAC在用户身份验证和消息传输中起到关键作用,提供了一种安全的认证机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值