我在维基百科上阅读HMAC,我对几点感到困惑。
- 我在哪里使用 HMAC?
- 为什么是哈希的关键部分?
- 即使有人成功地使用了“长度扩展攻击”,这对攻击者有什么用处?
我在维基百科上阅读HMAC,我对几点感到困惑。
消息认证码 (MAC)是通过MAC 算法从消息和密钥中产生的。MAC 的一个重要特性是,在不知道密钥的情况下不可能生成消息的 MAC 和密钥。由不同密钥生成的同一消息的 MAC 看起来不相关。即使知道其他消息的 MAC 也无助于计算新消息的 MAC。
HMAC是基于散列函数的 MAC 。基本思想是将密钥和消息连接起来,并将它们散列在一起。由于不可能,给定一个密码散列,找出它的散列是什么,知道散列(或什至这样的散列的集合)并不能找到密钥。基本的想法并不完全奏效,部分原因是长度扩展攻击,所以实际的 HMAC 构造要复杂一些。有关更多信息,请浏览Cryptography Stack Exchange 上的 hmac 标签,尤其是为什么 H(k||x) 不是安全的 MAC 结构?, H(k||length||x) 是一个安全的 MAC 结构吗?和HMAC 与 MAC 函数. 还有其他定义 MAC 的方法,例如基于分组密码的 MAC 算法,例如CMAC。
MAC对消息进行身份验证。如果 Alice 看到一条消息和一个 MAC 并且知道相关的密钥,她可以通过自己进行 MAC 计算来验证 MAC 是由知道密钥的委托人生成的。因此,如果消息附带正确的 MAC,则意味着该消息在某个时刻被密钥持有者看到。MAC 是基于密钥的签名,它为基于公钥加密的签名方案提供类似的保证,例如基于 RSA 的方案,其中签名必须由拥有私钥的主体生成。
例如,假设 Alice 将她的密钥留给自己,并且只使用它来计算她存储在云服务器或其他不可靠存储介质上的消息的 MAC。如果她稍后读回一条消息并看到附加的正确 MAC,她就知道这是她过去存储的消息之一。
HMAC 本身不提供消息完整性。它可以是提供完整性的协议中的组件之一。例如,假设 Alice 将多个文件的连续版本连同它们的 MAC 一起存储在不可靠的媒体上。(我们再次假设只有 Alice 知道密钥。)如果她读回具有正确 MAC 的文件,她知道她读回的是她存储的某个文件的某个先前版本。控制存储介质的攻击者仍然可以返回旧版本的文件或不同的文件。在这种情况下提供存储完整性的一种可能方法是将文件名和版本号作为计算其 MAC 的数据的一部分。Alice 需要记住每个文件的最新版本号,以验证她没有收到过时的数据。
¹ “不可能”是指需要比实际可能更多的计算能力。
HMAC 是一个计算出的“签名”,通常与一些数据一起发送。HMAC 用于验证(验证)数据未被更改或替换。这里有一个比喻:
你要寄一个包裹给莎拉,里面有一张照片。您希望她打开包裹并查看照片。在不久的将来的某个时候,您希望她会寄回带有那张照片的包裹。至关重要的是,她将同一张照片放回包裹中。你需要绝对确定她不会给你发回一张修改过的照片,哪怕是一点点,或者用不同的照片替换它。您每天都会收到数百个带有不同照片的包裹;你永远不会记得这张照片的细节,以至于你可以分辨出她是否改变了一点点(就像她从脸上喷了一个小痘痘一样)。
这是你可以做的:在你给她寄包裹之前,把另一张照片放在一个带锁的小盒子里。保留钥匙。将带锁的小盒子连同您要邮寄给她的原始照片一起放入包裹中。假设她知道她不会从包裹中取出上锁的盒子。当你从她那里收到包裹时,打开它,把照片放在桌子上。打开上锁的盒子,取出副本,比较两者。如果它们相同,则她没有更改照片(它是“真实的”)。如果上锁的盒子不在包裹中,或者您的钥匙无法打开它,那么假设她做了一些邪恶的事情并将整个包裹扔进垃圾桶。这里的美妙之处在于,您无需“记住”您最初发送给她的任何内容;
在上面的例子中,带锁的小盒子代表一个 HMAC。您的密钥是 HMAC 的密钥。照片是您应用 HMAC 的数据。
上面是一个往返的比喻,只有你有一把钥匙。在另一种情况下,假设您经常向 Tommy 发送包裹。您担心爱管闲事的邮递员可能会打开您的包裹并更换照片或更换照片。你对锁着的盒子做同样的事情,除了在这种情况下,你让汤米有钥匙的副本,这样当他收到包裹时,他可以打开里面的锁着的盒子并自己比较照片。如果收到后他发现照片不同,他的钥匙打不开盒子,或者盒子不见了,他就知道有问题了。
上面的比喻描述了为什么需要 HMAC,但并没有描述它们是如何工作的。让我们再次改变比喻,以更接近它们的工作方式:
让我们用照片保留包裹的心理意象:您想邮寄它,然后像以前一样再次接收它,确保照片没有被收件人更改或替换,或者在往返过程中。
在您合上包裹寄出之前,请先复印一张照片。这次没有上锁的盒子,而是用液体化学物质的混合物刷过副本。只有您知道这种混合物的配方(关键),并且每当您刷过副本时,您都会使用完全相同的笔触。这种混合物会旋转并将照片的副本模糊成类似于现代艺术的东西;我们称它为 HMAC。你不确定它干后会是什么样子,但你知道如果你用相同的配方和相同的笔触刷任意两张相同的照片,生成的 HMAC 看起来会一样。因此,您将干燥的 HMAC 与原始照片一起放入包装中,然后将其发送给莎拉。
当您从 Sarah 拿回包裹时,它包含您希望是未更改的原始照片以及您期望的是您创建并包含在其中的 HMAC。从包装中取出照片,复制它,然后用该副本创建另一个 HMAC(应用您的混合/画笔笔触)。将您刚刚创建的 HMAC 与包中返回的 HMAC 进行比较。如果它们相同,那么您可以确定莎拉和邮递员没有更改照片。
如果莎拉更改了照片,那么 HMAC 将不完全相同。如果 Sarah 更改了 HMAC,则 HMAC 将不相同。如果莎拉改变了照片,并试图创建一个新的 HMAC,那么 HMAC 将不一样(她不知道你的食谱)。
因此,您知道照片(数据)是否真实,这正是 HMAC 的用途。
简短的回答是“HMAC 使用对称密钥而不是 PKI提供数字签名”。本质上,如果您不想处理复杂的公钥/私钥、信任根和证书链,您仍然可以使用 HMAC 获得可靠的数字签名。HMAC 依赖于对称密钥加密和预共享秘密,而不是私有/公共对。缺点与一般的对称密钥加密相同——您现在需要担心密钥的分发和保护。
1. 每当您希望保持数据的完整性(和真实性)时,您都可以使用 HMAC
2. 密钥是 HMAC 的一部分,因为它是仅在 2 方之间已知的共享秘密,并且只有他们可以创建 HMAC 而其他人无法创建。(确保真实性)
3. HMAC 上不可能进行长度扩展攻击。另一方面,MAC 只是将密钥附加到易受其影响的消息中。引入 HMAC 是为了克服对 MAC 的这种攻击。