数字签名与HMAC,密钥通过DH

时间:2011-04-15 23:13:12

标签: security cryptography digital-signature hmac dsa

我正在编写一个大量使用密码学的应用程序。与大多数联网应用程序一样,我的数据将数据分解为不同类型的消息(即时消息,文件块,视频帧等) - 并且必须检查每个消息的防篡改和正确来源的真实性。到目前为止,我能够使用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ŭloEbermann。详情请见他的回答。)

因此,考虑到DH / ECDH安全地协商共享秘密,我不应该使用HMAC吗?

相关:为什么NSA为DSA而不是MAC指定标准算法?仅仅因为它可以是SHA-2 + AES?

速度在这里非常重要因为我想要这个协议,我现在不仅要支持短信,还要支持不久的大文件和视频帧。因此,我更喜欢使用HMAC,但希望确保我能达到上述目标。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

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

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

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


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

您收到消息M,散列函数H和共享密码K。添加两个公共函数f1f2(这些是一些简单的XOR +填充)。然后

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

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

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


关于这个问题:

  

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

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

其中的链接列表提到Galois Counter ModeTLS (RFC 5288)的“SSH (RFC 5647)”,据说可以保护其中的机密性和完整性。因此,不再需要单独的MAC。 (这是我第一次看到这个,所以我现在无法判断。)