【发布时间】:2015-05-28 08:47:30
【问题描述】:
我有一个独特的电子邮件地址列表 - 一个非常简单的问题。如果电子邮件是唯一的,则输出将始终是唯一的,
hash('md2', $email);
【问题讨论】:
-
不,hash clash or collision 就是这样
标签: php hash cryptography string-hashing
我有一个独特的电子邮件地址列表 - 一个非常简单的问题。如果电子邮件是唯一的,则输出将始终是唯一的,
hash('md2', $email);
【问题讨论】:
标签: php hash cryptography string-hashing
好吧,根据维基百科,最好的攻击是:
在 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 个字符串来保证至少发生一次散列冲突。
【讨论】: