Hut*_*ut8 5 security cryptography digital-signature hmac dsa
我正在编写一个大量使用密码学的应用程序。像大多数网络应用程序一样,我的将数据分解为不同类型的消息(即时消息、文件块、视频帧等)——并且必须检查每个消息的真实性,以防止篡改和正确的来源。到目前为止,我能够使用 ECDH 来协商我已经用于 AES 的共享秘密。当然,以后可以使用相同的共享秘密。
我的问题是:在这种情况下,使用 ECDSA 来签署每条消息是否有任何额外的好处,而不是简单地使用 ECDH 与 HMAC 建立的共享秘密?
下面,当我说 M 时,我的意思是加密消息或明文;应该没关系。请更正以下任何错误。
我知道在 ECDSA(或 DSA)中,通常M使用安全散列算法(我目前使用 SHA-2 之一)对消息 ( ) 进行散列处理H(M),然后H(M)使用签名者的私钥对其进行加密。这会产生R和S整数(签名)。然后,M、R 和 S 被发送给已经拥有发送者公钥的接收者。 H'(M)计算,并使用R和验证签名S。BouncyCastle 提供了ECDSASigner实现这一点的方法。
在 HMAC 中,需要一个共享机密,我有。然后:(
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
感谢您的更正,Pa?lo Ebermann。有关详细信息,请参阅他的回答。)
那么,考虑到 DH/ECDH 安全地协商共享秘密,我是否有理由不使用 HMAC?
相关:为什么NSA为 DSA 而不是 MAC 指定标准算法?仅仅因为它可以是 SHA-2 + AES?
速度在这里很重要,因为我希望我正在制定的这个协议不仅支持现在的文本消息,而且在不久的将来支持大文件和视频帧。因此,我更喜欢使用 HMAC,但要确保我可以达到上述目标。
谢谢你的帮助!
DSA 的一个缺点是您需要相当多的随机字节来进行签名。甚至在这种情况下,使用错误的随机源可以根据签名重建您的私钥。对于 MAC,您必须签署大量消息,因此需要大量随机数。如果你没有硬件产生这些,你就会耗尽熵。
HMAC 不需要任何随机数(它是确定性的)。
另外,我认为 HMAC 比此处使用 DSA 更有效,但您可以(并且应该)对此进行测量。
关于“纠正错误”:您对 HMAC 的描述不太正确 - 没有“解密”。它更像是这样的:
您拥有消息M、散列函数H和共享秘密K。添加两个公共函数f1和f2(这些是一些简单的 XOR + 填充)。然后
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
Run Code Online (Sandbox Code Playgroud)
是||简单的串联。发送者和接收者进行相同的计算,发送者将他的结果与消息一起发送,然后接收者将他的结果与发送的结果进行比较。(确保您以不允许计时攻击的方式进行比较,即比较所有内容,即使您已经发现它不匹配。)
HMAC 的确切定义在RFC 2104中,其中还包含一些澄清的数字。
关于这个问题:
相关:为什么NSA为 DSA 指定标准算法而不是 MAC?
我不太确定,但这里有一个想法:
那里的链接列表提到了TLS (RFC 5288)和SSH (RFC 5647)的“ Galois Counter Mode ” ,据说这可以同时保护机密性和完整性。因此不再需要单独的 MAC。(这是我第一次读到这篇文章,所以我现在无法判断。)
| 归档时间: |
|
| 查看次数: |
5352 次 |
| 最近记录: |