我想要实现一个协议,它的消息需要完整性和身份验证。我发现了许多提供完整性和认证的算法,如HMAC、UMAC和Poly1305。所以我搞不懂我该用哪一种。拜托,我能知道哪个更好吗?
发布于 2018-03-13 16:55:29
首先,HMAC-任何特定的散列函数,比如HMAC- say 256-是不同于UMAC和Poly1305的一种类型的东西。因此,直接比较它们是有误导性的。
HMAC 256是 pseudorandom函数族或 PRF,具有长输入和短输出,这意味着一个键控函数族$H_k\colon {0,1}^* \\到{0,1}{256}$,如果256位密钥$k$均匀分布,则$H_k$在所有函数( $F\colon {0,1}^* \\到{0,1}{256}$)之间呈现均匀分布。您可以使用$t = H_k(m)$作为身份验证标记来验证消息,因为不知道$k$的对手不能比不知道$F$的对手猜到$F(m)$要好得多,而后者在一次尝试中猜测$H_k(m)$的几率为$2^{-256}。
UMAC和Poly1305是一次性验证器。您可以使用密钥$k$一次来验证单个消息$m$,方法是使用$t = \operatorname{Poly1305}_k(m)$作为身份验证标记。如果您曾经透露过$\operatorname{Poly1305}_k(m)$和$\operatorname{Poly1305}_k(m')$,则对手可以在他们选择的任何消息上计算$k$和伪造身份验证标记。但是,您可以将这些扩展为处理许多消息,每条消息都具有不同的序列号或名为nonce的非碰撞随机令牌$n$,方法是使用PRF组合它们,然后使用(例如,$t =\operatorname{Poly1305}{k_n}(M)$),其中$k_n = \operatorname{HMAC-SHA256}_k(n)$。You绝不能对两个不同的消息重用相同的$(k,n)$对。
关于消息认证码、一次验证器、HMACs和伪随机函数族的更多信息,先前的一个问题有几个很好的答案。
通常,现在,Poly1305被用于一个名为NaCl密码_分泌箱_xsalsa20poly1305或利伯钠变体之一的预定义组合中,它同时使用PRF XSalsa20派生一次性密钥$k_n$,并作为流密码派生用于加密消息的一次性pad。<#>这种 authenticated加密组合,crypto_secretbox_xsalsa20poly1305在几乎任何CPU上都比涉及HMAC的任何经过身份验证的加密要快得多。(可能的例外:也许在一个微型微控制器上,您将拥有对HMAC 256的硬件支持,但不支持XSalsa20或Poly1305)。
Does的意思是HMAC- that 256是无用的? No.您在会话中并不总是有消息序列号。例如,如果要在大多数无状态的web应用程序中分发承载令牌,为了使用Poly1305作为身份验证器,必须将${geq}192美元-位随机选择为PRF的输入,以选择密钥,该密钥连同128位Poly1305输出将为身份验证器标记花费320位空间,而对于本质上相同的安全性(用于短消息和低数据量),您可以使用HMAC-SHA256的128位截断,或者BLAKE2s-128或KMAC128-128。
https://crypto.stackexchange.com/questions/56429
复制相似问题