密码学基础-Hash、MAC、HMAC 的区别与联系

密码学基础-Hash、MAC、HMAC 的区别与联系

Hash

Hash 是一种从一段数据中创建小的数字“指纹”的方法。就像一个人的指纹代表一个人的信息一样,Hash 对输入的数据进行整理,生成一个代表该输入数据的“指纹” 数据。通常该指纹数据也可称之为摘要、散列、校验和。常见的 Hash 有 CRC、SHA1、SHA2、SHA3、SHA256 和 MD5。
生成 Hash_code 的数学表达使可以简写为:

hash_code = sha256(message);

在这里插入图片描述
Hash 具有抗碰撞的特性,即在指定的输入范围内保证两个不同的数据生成的摘要是不同的。借助此特性,Hash 最大的用途是通过小体积的摘要值,来执行数据的完整性校验。以上图为例,发送放将 1G 的消息数据和 MD5 算法生成的 128bit 的摘要发送给接受方;接收方接受到消息+摘要后也使用 MD5 算法重新计算消息的摘要,然后对比接收到的摘要计算后的摘要,若两者相等就代表消息没有发生误码或者被篡改。
常见的 Hash 函数:
在这里插入图片描述
Hash 函数并不能保证数据来自合法的发送方,如果是不法分子使用 MD5 算法发送一段数据+摘要给到数据接收者,那么接收者仍旧会接收该数据,从而造成安全风险。

MAC

MAC,即消息认证码。与Hash 类似,它也用一段小的数据(称为MAC)来代表一段数据,不同的是,MAC 在生成消息认证码时使用对称加密来保证数据来自约定好的合法的伙伴。
mac_code 的计算方法可以通过下述数学公式进行表达:

mac_code = mac_algorithm(mac_key + message);

MAC 的认证机制如下:

  1. 发送者和接收者存储对称加密的密钥。
  2. 发送者通过MAC算法计算出消息的MAC值,并和消息一起发给收信者
  3. 收信者用同样的MAC算法计算收到的消息的MAC值,并对比接收到的mac计算后的mac

在这里插入图片描述
从本质上讲,MAC是一种算法,它将消息与共享密钥组合在一起作为输入,输出一个代表共享密钥和消息的数据。

MAC可用于数据完整性和身份验证。消息、密钥中的任何更改都会导致不同的 MAC,因此只要没有密钥,攻击者就无法识别和验证MAC。

MAC 算法可能受到长度扩展攻击

MAC 算法面临的常见威胁是长度扩展攻击。要实现长度扩展攻击只需要知道密钥的长度和使用的算法即可。
假设 MAC 算法是:

mac_code = md5("my_key" + "my_message1")

原始要发送的消息+mac 是:

"my_message1" + mac1

然而使用过 md5 计算的开发人员都知道,MD5 计算具备可循环冗余计算的特性:

md5_code1 = md5("base");
md5_code2 = md5(md5_code1  + "extern");

其中,md5_code1、md5_code2 都是正确的 md5 mca。即在计算 md5 mac 时,可以在上一次的基础上追加一个数据,得到的 MD5 数据仍旧是正确的 MD5 mac。
那么作为攻击者,要实现长度扩展攻击,主要需完成下面几步:

  1. 设法获取 MAC 算法的 KEY 的加密数据 secret 的长度(不需要知道 key 的值)。
  2. 生成一个附加消息(extern)。使用原始消息对应的 md5_code1 与扩展的消息(攻击数据)生成 md5_code2.
  3. 重新组合 secret + base + extern + md5_code2,这样接收方在接收到数据后,运行 md5 算法并对 secret 执行解密数据,就会发现数据是对的,然而实际上,攻击者在原始的 base 信息后面增加了一段恶意的数据 extern,这中恶意数据可能是一些窃取、攻击类信息,容易造成安全隐患。

HMAC

HMAC 算法本质属于 MAC 算法的一种。其保留了对称密钥、生成 MAC 消息认证码的特点。但是进一步结合了哈希函数和密钥加密技术。
根据用于计算 MAC 的哈希函数,可以定义许多示例,目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。

HAMC 通常可以使用下述数学表达式来简单概述:

HMAC = Hash(key1 + Hash(key2 + message))

HMAC 使用两个密钥,并执行两轮哈希计算。该算法的第一轮从原始消息和第一个密钥 K1 生成内部哈希 HMAC1。然后,第二轮使用生成的内部哈希和第二个密钥 K2 创建最终的 HMAC。接收方计算自己的 HMAC,并将其与接收的 HMAC 进行比较,以验证消息的身份验证和完整性,如下图所示:
在这里插入图片描述
HAMC 算法具有以下特点:

  • HMAC输出和原有的哈希算法长度一致。
  • HMAC 机制依赖于两轮对称加密时密钥的安全性,密钥一旦泄露就不安全了。

HMAC算法的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3) 客户端将收到的随机数与自己的密钥进行HMAC-SHA1运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 。

从挑战-应用的使用场景看 HMAC 算法的安全性:

HMAC算法引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:
(1)使用的密钥是双方事先约定的,第三方不可能知道,因此数据的收发方是可信的。由上面介绍应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。
(2) HMAC算法与一般的加密重要的区别在于它具有“瞬时”性,即破解只在本条消息有效,对其他消息被破解无法提供帮助,而加密算法被破解后,以前的加密消息就可能被解密。

总结

  • 本文主要介绍 Hash、MAC、HMAC 的联系与区别,层层递进地描述了如何增加数据的安全性。
  • hash只能验证数据完整性,无法保证数据防篡改,计算过程无密钥参与。
  • MAC既可以验证数据完整性,也可以验证数据是由原始发送方发出的,计算过程有密钥参与,使用对称加密算法构造。
  • HMAC是mac的一种,可以验证数据完整性,也可以验证数据是由原始发送方发出的,使用hash函数来构造,hmac输出长度与原始 HASH 算法的长度一样。
  • HASH 旨在检测数据的意外更改,而 HMAC 旨在检测故意更改。
  • MAC 算法通常不单独使用。取而代之的是,它们被集成到加密算法中,构建了我们所说的 AEAD(具有关联数据的身份验证加密)。它们还可以与哈希函数结合使用,创建 HMAC、SHA1-HMAC 和 MD5-HMAC 等算法。
  • HMAC 和数字签名都确保了消息的完整性和真实性。完整性意味着消息未被更改。真实性表示收件人确信邮件来自发件人。
  • MAC 和 HMAC 之间的主要区别在于消息认证码(代表消息的一小段数据,就像数据的指纹)的计算方式。在 MAC 算法中,消息认证码通常是通过将加密函数直接应用于消息和密钥来计算的。HMAC 使用更复杂的结构,涉及哈希函数的两次传递,以及内部和外部填充的使用。
  • HMAC可以任何 HASH 算法一起使用,使其成为MAC应用程序的灵活选择。HMAC 已被广泛用于各种协议和标准,包括 IPsec、SSL/TLS 和 SSH。
  • HMAC的缺点是其使用共享密钥,这存在不可否认性问题。如果发送方或接收方的密钥遭到泄露,攻击者将很容易创建未经授权的消息,实现中间人攻击。
  • 当代密码学的关键支柱是数据机密性、数据完整性、身份验证和不可否认性。我们可以通过下述文章进一步了解密码学相关的知识。

相关推荐

  1. 密码基础古典密码

    2024-07-22 09:50:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 09:50:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 09:50:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 09:50:01       45 阅读
  4. Python语言-面向对象

    2024-07-22 09:50:01       55 阅读

热门阅读

  1. 20240721图像扩边与填充详解

    2024-07-22 09:50:01       14 阅读
  2. 自动化UI测试元素定位精炼

    2024-07-22 09:50:01       15 阅读
  3. 贪吃蛇游戏

    2024-07-22 09:50:01       15 阅读
  4. 16、基于共享内存二叉树的LRU

    2024-07-22 09:50:01       14 阅读
  5. springboot集成kafka | 分布式消息发布和订阅系统

    2024-07-22 09:50:01       14 阅读
  6. shell脚本教程学习

    2024-07-22 09:50:01       13 阅读