加密算法(四)-消息认证码算法(HMAC、CMAC)一篇了解所有主流消息认证码算法,轻松上手使用。

一、消息认证码算法

1.1、HMAC

        结合了哈希函数和密钥的消息认证码算法,用于验证消息的完整性和真实性。HMAC 可以基于不同的哈希函数实现,如 HMAC - MD5、HMAC - SHA1、HMAC - SHA256 等。

优点

1.通用性强:HMAC 可以基于多种常见的哈希函数(如 MD5、SHA - 1、SHA - 256 等)来实现,因此具有很好的通用性和灵活性。用户可以根据具体的安全需求和性能要求选择合适的哈希函数。

2.安全性高:通过结合哈希函数和密钥,HMAC 能够有效抵御各种攻击,包括消息篡改、重放攻击等。即使攻击者知道使用的哈希函数,在没有密钥的情况下也无法伪造有效的消息认证码。

3.易于实现:HMAC 的实现相对简单,许多编程语言和加密库都提供了现成的 HMAC 实现,方便开发者使用。

缺点

1.依赖哈希函数的安全性:HMAC 的安全性依赖于所使用的哈希函数的安全性。如果底层的哈希函数被发现存在安全漏洞,那么 HMAC 的安全性也会受到影响。例如,如果使用已经被破解的 MD5 作为底层哈希函数,HMAC 的安全性将大大降低。

2.性能开销:由于需要进行哈希计算,HMAC 的计算开销相对较大,尤其是在处理大量数据时,可能会对系统性能产生一定的影响。

加密

// HMAC-SHA256 计算
    public static String hmacSha256(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac hmac = Mac.getInstance("HmacSHA256");
        SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
        hmac.init(secretKey);
        byte[] macBytes = hmac.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(macBytes);
    }

输出结果

public static void main(String[] args) {
        String data = "Hello, 感谢关注,精华内容将持续更新!";
        String key = "ThisIsASecretKey";
        try {
            // HMAC-SHA256 测试
            String hmacResult = hmacSha256(data, key);
            System.out.println("HMAC-SHA256 结果: " + hmacResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


HMAC-SHA256 结果: zpvuayb2GF687wb4j5eBpc9aALySa41fxANPhN/1stU=

1.2、CMAC

        基于对称分组密码算法的消息认证码算法,通常使用 AES 等对称加密算法。CMAC 具有较高的安全性和效率,广泛应用于网络通信和数据存储等领域。

优点

1.安全性基于对称加密算法:CMAC 基于对称分组密码算法(如 AES),其安全性依赖于对称加密算法的安全性。对称加密算法经过了大量的研究和分析,具有较高的安全性。

2.高效性:CMAC 的计算效率较高,尤其是在处理大数据块时,比一些基于哈希函数的消息认证码算法(如 HMAC)具有更好的性能表现。

3.与加密算法集成性好:由于 CMAC 基于对称加密算法,它可以很方便地与对称加密算法集成,在加密数据的同时进行消息认证,提高系统的安全性和效率。

缺点

1.密钥管理复杂:CMAC 使用对称密钥,密钥的管理和分发是一个挑战。如果密钥泄露,攻击者可以伪造有效的消息认证码,从而破坏系统的安全性。

2.算法复杂度相对较高:与一些简单的哈希算法相比,CMAC 基于对称加密算法,其算法复杂度相对较高,实现起来可能需要更多的代码和资源。

代码

// CMAC-AES 计算(需要 Bouncy Castle 库)
    public static String cmacAes(String data, String key) throws Exception {
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        Mac cmac = Mac.getInstance("AESCMAC", "BC");
        SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        cmac.init(secretKey);
        byte[] macBytes = cmac.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(macBytes);
    }

输出结果

public static void main(String[] args) {
        String data = "Hello, 感谢关注,精华内容将持续更新!";
        String key = "ThisIsASecretKey";
        try {
            // CMAC-AES 测试
            String cmacResult = cmacAes(data, key);
            System.out.println("CMAC-AES 结果: " + cmacResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


CMAC-AES 结果: vCfiaJzKphn5E2+kpOeKBg==

通过以上内容便可轻轻松松使用是消息认证码算法.是不是超级简单.有任何问题欢迎留言哦!!!

重点!重点!重点!

遇到问题不用怕不如来我的知识库找找看,也许有意想不到的收获!!!

易网时代-易库资源-易库教程:.NET开发、Java开发、PHP开发、SqlServer技术、MySQL技术-开发资料大全-易网时代-易库资源-易库教程 (escdns.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值