我有一个唯一电子邮件地址列表 - 一个非常简单的问题。如果电子邮件是唯一的,输出将始终是唯一的,
hash('md2', $email);
我有一个唯一电子邮件地址列表 - 一个非常简单的问题。如果电子邮件是唯一的,输出将始终是唯一的,
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 个字符串来保证至少发生一次散列冲突。