用MD2散列唯一字符串


Hashing unique strings with MD2

我有一个唯一的电子邮件地址列表——一个非常简单的问题。如果电子邮件是唯一的,输出是否总是唯一的,

hash('md2', $email);

根据维基百科的说法,最好的攻击是:

2009年,MD2被证明容易受到碰撞攻击,压缩函数求值的时间复杂度为2^63.3,内存需求为2^52哈希值。这比生日攻击稍微好一点,生日攻击预计需要265.5次压缩函数评估。

然而,找到一个简短的电子邮件地址的冲突仍然是棘手的。

如果你真的需要更多的安全性 128位哈希值,你最好使用SHA-256的第一个(最左边的)128位,这在写这篇文章的时候被认为是安全的。使用完整的256位当然是首选。

偶然产生碰撞的机会接近于零。所以如果你只是用它来创造一些独特的东西(即不考虑有针对性的攻击),那么使用MD2是好的。即使这样,如果可以更改协议,也可以使用SHA-256。

像MD2这样的哈希函数就像名字所暗示的消息摘要算法一样,它们接受任意长度的输入并给出固定长度的输出。对于唯一的输入,必然存在碰撞。

您可以使用更强的散列函数,如SHA-256,其中两个字符串之间的冲突与MD2相比是极不可能的。生日悖论在这里适用,所以你不应该使用MDx函数或任何短于256位哈希函数的函数。

我看到你在散列电子邮件地址。根据您的系统,这可以通过碰撞来利用。例如,一些电子邮件提供程序支持"myname+1@domain.com"、"myname+2@domain.com"等形式的虚拟地址。攻击者可能会利用这一事实来查找与已知的其他电子邮件地址的冲突,例如获取密码重置电子邮件或类似的内容。

MD2产生128位的哈希值。通过对2^128+1字符串进行哈希处理,可以保证至少有一次哈希冲突。