【发布时间】:2011-08-06 16:40:04
【问题描述】:
我正在编写一个大量使用密码学的应用程序。与大多数网络应用程序一样,我的应用程序将数据分解为不同类型的消息(即时消息、文件块、视频帧等)——并且必须检查每个消息的真实性,以防篡改和正确的来源。到目前为止,我可以使用 ECDH 来协商我已经用于 AES 的共享密钥。当然,以后可以使用相同的共享密钥。
我的问题是:在这种情况下,使用 ECDSA 来签署每条消息,而不是简单地使用由 ECDH 与 HMAC 建立的共享密钥有什么额外的好处吗?
下面,当我说 M 时,我指的是加密消息或明文;没关系。请更正以下任何错误。
我了解在 ECDSA(或 DSA)中,通常使用安全散列算法(我目前正在使用其中一个 SHA-2)对消息 (M) 进行散列以生成 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,但想确保我能达到上述目标。
感谢您的帮助!
【问题讨论】:
标签: security cryptography digital-signature hmac dsa