我在Wikipedia上阅读HMAC时,感到有些困惑。


我在哪里使用HMAC?
为什么哈希的关键部分是什么?即使有人成功使用了“长度扩展攻击”,这对攻击者有什么用?

评论

如果有人好奇,我想知道的是hmac是使用对称密钥对数据进行签名的一种方法。 “这比将消息和密钥散列在一起更复杂,这是不安全的”,这是一个好处。

我的一个朋友经营着世界上最大的“加密货币”交易所之一。他的API需要使用用户专用api密钥(这是您在问题中所指的“秘密”)对用户的所有api调用进行HMAC签名,其中包括哈希中的公用密钥。这是基本用例,是API调用的附加安全层。在加密货币世界中,尽管进行了数百万次尝试,他仍然是唯一一个被黑客入侵的平台。 HMAC非常有用,只需确保您知道如何使用它即可。我以为自己做到了,但是没有,以毁灭性的API骇客的形式付出了代价。

用这个来调试8gwifi.org/hmacgen.jsp

#1 楼

通过MAC算法从消息和密钥生成消息验证码(MAC)。 MAC的一个重要特性是不可能在不知道密钥的情况下产生消息和密钥的MAC。由不同密钥产生的相同消息的MAC看起来无关紧要。即使知道其他消息的MAC也无法帮助计算新消息的MAC。

HMAC是基于哈希函数的MAC。基本思想是将密钥和消息连接在一起,并将它们哈希在一起。由于在给定密码学哈希值的情况下不可能找出它的哈希值,因此知道哈希值(甚至是此类哈希值的集合)就不可能找到密钥。基本思想尚未完全解决,部分原因是由于长度扩展攻击,因此实际的HMAC构造要复杂一些。有关更多信息,请浏览密码栈交换上的hmac标记,尤其是为什么H(k || x)不是安全的MAC构造?为什么H(k || length || x)是安全的MAC构造?和HMAC与MAC功能。还有其他定义MAC的方法,例如基于块密码的MAC算法,例如CMAC。

MAC对消息进行身份验证。如果Alice看到一条消息和一个MAC并且知道关联的秘密密钥,则她可以通过自己进行MAC计算来验证该MAC是由知道该密钥的主体生成的。因此,如果消息附带正确的MAC,则表示该消息在某个时候被秘密密钥的持有者看到。 MAC是基于密钥的签名,与基于公钥密码术的签名方案(例如基于RSA的方案)提供相似的保证,其中签名必须由拥有私钥的委托人产生。 >
例如,假设爱丽丝将自己的秘密密钥保留给自己,并且仅使用它来计算她存储在云服务器或其他不可靠的存储介质上的消息的MAC。如果她以后回读一条消息并看到正确的MAC,则说明她知道这是她过去存储的消息之一。

HMAC本身不提供消息完整性。它可以是提供完整性的协议中的组件之一。例如,假设爱丽丝将多个文件的后续版本及其MAC存储在不可靠的介质上。 (同样,我们假设只有爱丽丝知道密钥。)如果她回读了具有正确MAC的文件,则她知道回读的内容是所存储文件的某个先前版本。控制存储介质的攻击者仍可能返回文件的旧版本或其他文件。在这种情况下,提供存储完整性的一种可能方法是将文件名和版本号作为其MAC计算数据的一部分。爱丽丝需要记住每个文件的最新版本号,以确认没有给她陈旧的数据。确保完整性的另一种方法是让Alice记住每个文件的MAC(但是在这种特定情况下,哈希也可以做得很好)。力量比实际可行。

评论


我觉得这有点不清楚和冗长,尽管我确实学到了一点

–肺炎
15-10-23在20:52

可以共享hmac代码吗?对我来说似乎令人困惑-这是一个哈希,但无法共享。

– R11G
19年5月3日在20:47



@ R11G我不明白你的问题。请注意,“这是哈希”不是理解HMAC的有用方法。 HMAC是MAC。它基于哈希的事实是实现细节。其他MAC算法具有相同的安全性属性,但内部不使用哈希,例如CMAC。

–吉尔斯'所以-不再是邪恶的'
19年5月3日在21:03

@吉尔斯抱歉。我的意思是,如果我在服务日志中记录HMAC,这是否是潜在的安全漏洞?

– R11G
19年5月3日在22:26

@ R11G这取决于它的HMAC以及您要达到的安全保证。没有密钥,您无法从HMAC返回到输入。即使使用该键,也只能通过猜测输入并进行检查来返回。但是,如果两次看到相同的HMAC,则知道它必须是具有相同键的相同输入。

–吉尔斯'所以-不再是邪恶的'
19年5月4日在22:08

#2 楼

HMAC是经常与一些数据一起发送的计算出的“签名”。 HMAC用于验证(验证)数据是否已更改或替换。这是一个比喻:

您将要邮寄一个包含照片的包裹给Sarah。您希望她打开包装并查看照片。您希望在不久的将来的某个时候,她会把包装好的照片寄回给您。她将同一张照片放回包装盒至关重要。您需要绝对确定她不会将更改过的照片发回给您,也不会换成其他照片。您每天都会有数百个带有不同照片的软件包打包出售;您永远不会记得如此详细的照片,以至于无法分辨她是否做了一点改动(例如是否用喷枪将脸上的小痘痘喷了一下)。您将包裹寄给她,将照片的另一份副本放在一个小的带锁的盒子中。保持钥匙。将带锁的小盒子与您邮寄给她的原始照片一起放在包装内。假设她知道自己不打算从包裹中取出上锁的盒子。当您从她那里收到包裹时,将其打开,将照片放在桌子上。打开锁盒,取出副本,比较两者。如果它们相同,则表示她没有更改照片(“真实”)。如果锁中的盒子不在包装中,或者您的钥匙无法打开它,则假定她做错了事,并将整个包装扔到了垃圾箱。这样做的好处是,您无需“记住”您最初寄给她的东西的任何内容。确保照片合法性所需的所有内容都将返回包装内。

在上面的示例中,小的锁定框表示HMAC。您的密钥是HMAC的密钥。照片是您将HMAC应用于的数据。

上面是一个往返比喻,其中只有您有一把钥匙。在不同的情况下,假设您经常将包裹发送给Tommy。您担心爱管闲事的邮递员可能会打开您的包裹并替换照片或进行更改。您对带锁的盒子执行相同的操作,除了在这种情况下,您要让汤米(Tommy)拥有钥匙的副本,以便他收到包裹时,他可以打开随附的带锁的盒子并自己比较照片。如果收到后他发现照片有所不同,他的钥匙没有打开盒子或盒子丢失了,那么他知道有些东西是可疑的。他们工作。让我们再次更改隐喻以更接近它们的工作方式:

让照片保留包裹的心理意象:您想将其邮寄,然后像以前一样再次接收,确保照片没有被接收器更改或更换,或者在往返过程中。

在关闭包装并邮寄之前,请复制照片。这次没有锁定的盒子,而是用液体化学药品的混合物刷满了副本。只有您知道此混合物的配方(键),并且每当刷完副本时,都使用完全相同的笔触。混合物将使照片的副本打乱并模糊成类似于现代艺术的东西。我们称之为HMAC。您不确定它干后的样子,但是您知道如果用相同的配方和相同的笔触刷任何两张相同的照片,则生成的HMAC看起来将相同。因此,您将干燥的HMAC与原始照片一起放入包装中,然后将其发送给Sarah。

从莎拉(Sarah)拿回包裹时,其中包含您希望未更改的原始照片以及您希望创建并包含的HMAC。从包装中取出照片,进行复制,然后使用该副本创建另一个HMAC(应用混合/画笔笔触)。将您刚创建的HMAC与软件包中返回的HMAC进行比较。如果它们相同,则可以确定Sarah和邮递员没有更改照片。

如果莎拉(Sarah)更改了照片,则HMAC将不相同。
如果莎拉(Sarah)更改了HMAC,则HMAC将不相同。照片,并尝试创建新的HMAC,那么HMAC将不会完全相同(她不知道您的食谱)。

因此您知道照片(数据)是否真实,这正是HMAC的用途。

评论


谢谢。我发现您的“油画”解释确实很有帮助。

– Lucian Wischik
19年6月14日在20:05

(是的,我知道我要迟到5年。)当莎拉收到您的多张照片时,就会出现问题。她可能会给您发回错误的密码,并且由于“密钥”很常见,因此您很乐意接受。可能需要进行其他检查,或者接受此风险。吉尔斯在上面描述了这个问题。

–domen
19年7月25日在9:21

#3 楼

简短的答案是“ HMAC使用对称密钥而不是PKI提供数字签名”。本质上,如果您不想处理复杂的公钥/私钥,信任根和证书链,则仍可以使用HMAC获得可靠的数字签名。 HMAC依靠对称密钥加密和预共享的机密,而不是专用/公用对。缺点与一般的对称密钥密码学相同-您现在需要担心秘密密钥的分发和保护。

评论


谢谢,我试图了解您将在什么情况下使用HMAC而非公钥数字签名方案,这似乎是一个很好的示例,说明为什么-您不需要PKI

–詹姆斯·艾伦(James Allen)
2015年9月11日14:52

对称和非对称密钥之间的重要区别

– Cuga
16-10-17在19:10

您是说HMAC不需要PKI吗?

– PRVS
17-2-22在15:14

@PRVS是的,完全正确,HMAC不需要PKI。

– dtoubelis
17-2-22在15:50



#4 楼

1。每当需要维护数据完整性(和真实性)时,都可以使用HMAC

2。密钥是HMAC的一部分,因为它是只有两个参与方之间已知的共享秘密,只有他们才能创建HMAC,而没有其他人可以创建。 (确保真实性)

3。在HMAC上无法进行长度扩展攻击。另一方面,MAC仅将密钥附加到消息中,这很容易受到影响。引入HMAC是为了克服对MAC的这种攻击。

评论


+1令我感到困惑,为什么只添加消息和密钥,以及密钥与仅对其进行连接有何不同?虽然我还是很困惑。

– doc_id
2014年1月26日10:28



#5 楼


需要检查两个“完整性”和“真实性”时使用HMACS。例如:考虑一个向您发送一条数据及其哈希值的场景-您可以通过重新计算消息的哈希值并将其与收到的哈希值进行比较来验证消息的完整性。但是,您不确定消息和哈希值是否由您认识/信任的人发送。如果您曾使用过HMACS,则可以使用只有您和受信任方知道的秘密密钥来重新计算HMAC,并将其与您刚收到的HMAC进行比较-实际上,这是为了“真实性”。 />就像我前面提到的那样,密钥的保密性确保HMAC是由受信任方计算的。
HMACS不是密钥散列。当您使用键控哈希而不是HMACS时,可能会进行长度扩展攻击。要进一步阅读,您可能需要检查一下。消息吗?我不知道对方的公共密钥吗?如果我知道公共密钥,那么为什么消息中的密钥而不是我使用已知的密钥呢?派对?”


密钥不是“在”消息中。该密钥用于根据消息生成HMAC。用于生成HMACS的密钥不是任何人的“公共密钥”。它更像是两方之间的共享秘密。您可以查看适用于AWS的REST API身份验证方法,以更好地了解如何使用HMACS进行URL签名。