我正在编写一个大量使用密码学的应用程序。与大多数联网应用程序一样,我的数据将数据分解为不同类型的消息(即时消息,文件块,视频帧等) - 并且必须检查每个消息的防篡改和正确来源的真实性。到目前为止,我能够使用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ŭloEbermann。详情请见他的回答。)
因此,考虑到DH / ECDH安全地协商共享秘密,我不应该使用HMAC吗?
相关:为什么NSA为DSA而不是MAC指定标准算法?仅仅因为它可以是SHA-2 + AES?
速度在这里非常重要因为我想要这个协议,我现在不仅要支持短信,还要支持不久的大文件和视频帧。因此,我更喜欢使用HMAC,但希望确保我能达到上述目标。
感谢您的帮助!
答案 0 :(得分:4)
DSA的一个缺点是你的签名需要一些好的随机字节。即使是使用错误的随机源,您的私钥也可以从签名重建。对于MAC,您必须签署大量消息,因此您需要大量随机数。如果你没有硬件产生这些,你将耗尽熵。
HMAC不需要任何随机数(这是确定性的)。
此外,我认为HMAC在这里比使用DSA更有效,但你可以(而且应该)衡量这一点。
关于“正确错误”:您对HMAC的描述不太正确 - 没有“解密”。它更像是这样:
您收到消息M
,散列函数H
和共享密码K
。添加两个公共函数f1
和f2
(这些是一些简单的XOR +填充)。然后
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
||
是简单连接。发送方和接收方进行相同的计算,发送方将其发送给消息,然后接收方将其结果与发送的结果进行比较。 (确保以不允许计时攻击的方式进行比较,即比较所有内容,即使您已经发现它不匹配。)
HMAC的确切定义在RFC 2104中,其中还包含一些澄清数字。
关于这个问题:
相关:为什么NSA为DSA而不是MAC指定标准算法?
我不太确定,但这是一个想法:
其中的链接列表提到Galois Counter Mode和TLS (RFC 5288)的“SSH (RFC 5647)”,据说可以保护其中的机密性和完整性。因此,不再需要单独的MAC。 (这是我第一次看到这个,所以我现在无法判断。)