【问题标题】:Digital Signature vs. HMAC with key via DH数字签名与 HMAC 与通过 DH 的密钥
【发布时间】:2011-08-06 16:40:04
【问题描述】:

我正在编写一个大量使用密码学的应用程序。与大多数网络应用程序一样,我的应用程序将数据分解为不同类型的消息(即时消息、文件块、视频帧等)——并且必须检查每个消息的真实性,以防篡改和正确的来源。到目前为止,我可以使用 ECDH 来协商我已经用于 AES 的共享密钥。当然,以后可以使用相同的共享密钥。

我的问题是:在这种情况下,使用 ECDSA 来签署每条消息,而不是简单地使用由 ECDH 与 HMAC 建立的共享密钥有什么额外的好处吗?

下面,当我说 M 时,我指的是加密消息或明文;没关系。请更正以下任何错误。

我了解在 ECDSA(或 DSA)中,通常使用安全散列算法(我目前正在使用其中一个 SHA-2)对消息 (M) 进行散列以生成 H(M),然后加密 H(M)使用签名者的私钥。这会产生 RS 整数(签名)。然后,M、R 和 S 被发送给已经拥有发送者公钥的接收者。计算H'(M),并使用RS验证签名。 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


    【解决方案1】:

    DSA 的一个缺点是您的签名需要相当多的随机字节。甚至在使用错误的随机源的情况下,您的私钥也可以从签名中重建。对于 MAC,您必须签署大量消息,因此您需要大量随机数。如果你没有硬件生产这些,你会耗尽熵。

    HMAC 不需要任何随机数(它是确定性的)。

    此外,我认为 HMAC 会比在这里使用 DSA 更有效,但您可以(并且应该)衡量这一点。


    关于“纠正错误”:您对 HMAC 的描述不太正确——没有“解密”。更像是这样:

    您有消息M、散列函数H 和共享密钥K。添加两个公共函数f1f2(这些是一些简单的异或+填充)。那么

    HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
    

    || 是简单的连接。发送者和接收者做同样的计算,发送者将他的计算结果与消息一起发送,然后接收者将他的结果与发送的结果进行比较。 (确保以不允许定时攻击的方式进行比较,即比较所有内容,即使您已经发现它不匹配。)

    HMAC 的确切定义在RFC 2104 中,其中还包含一些说明性的数字。


    关于这个问题:

    相关:为什么NSA 为 DSA 而不是 MAC 指定标准算法?

    我不太确定,但这里有一个想法:

    那里的链接列表提到了TLS (RFC 5288)SSH (RFC 5647) 的“Galois Counter Mode”,据说这是为了保护机密性和完整性。因此不再需要单独的 MAC。 (这是我第一次阅读,所以我现在无法判断。)

    【讨论】:

    • GCM 让我大吃一惊。感谢您强调这一点——看起来 BouncyCastle 在 org.bouncycastle.crypto.modes 中实现了它
    • 我刚刚在阅读GCM specification。似乎这与普通计数器模式与密文的密钥哈希相结合(而不是纯文本,至少与 SSH 中的 HMAC 一样)没有什么不同。并且这里的身份验证标签的工作原理与您在问题中描述 HMAC 的方式非常相似(仍然没有解密,双方加密 S 并且接收方比较结果)。
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2015-12-12
    • 2015-08-03
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多