【问题标题】:Hashing unique strings with MD2使用 MD2 散列唯一字符串
【发布时间】:2015-05-28 08:47:30
【问题描述】:

我有一个独特的电子邮件地址列表 - 一个非常简单的问题。如果电子邮件是唯一的,则输出将始终是唯一的,

hash('md2', $email);

【问题讨论】:

标签: php hash cryptography string-hashing


【解决方案1】:

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

在 2009 年,MD2 被证明容易受到时间复杂度为 2^63.3 压缩函数评估和内存要求为 2^52 哈希值的碰撞攻击。这比期望进行 265.5 次压缩函数评估的生日攻击略好。

然而,要找到短电子邮件地址的冲突仍然很棘手。

如果您确实需要更高的安全性 128 位哈希值,则最好使用 SHA-256 的第一个(最左边)128 位,这在撰写本文时被认为是安全的.使用完整的 256 位当然是首选。

意外发生碰撞的可能性几乎为零。因此,如果您只是使用它来创建一些独特的东西(即不考虑有针对性的攻击),那么使用 MD2 就可以了。即使这样,如果您可以更改协议,请改用 SHA-256。

【讨论】:

  • 当然也可以是前 32 个十六进制字符,如果您使用的是 PHP。
【解决方案2】:

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

您可以使用更强大的哈希函数(例如 SHA-256),与 MD2 相比,两个字符串之间的冲突极不可能发生。生日悖论适用于此,因此您不应使用 MDx 函数或任何短于 256 位哈希函数的函数。

我看到您正在对电子邮件地址进行哈希处理。根据您的系统,这可以通过碰撞来利用。例如,某些电子邮件提供商启用“myname+1@domain.com”、“myname+2@domain.com”等形式的虚拟地址。攻击者可能会利用这一事实来查找与已知其他电子邮件地址的冲突,以获取例如密码重置电子邮件或类似的东西。

【讨论】:

    【解决方案3】:

    MD2 产生一个 128 位的散列。您可以通过散列 2^128+1 个字符串来保证至少发生一次散列冲突。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 2012-11-13
      • 2011-09-30
      • 2011-12-25
      • 2018-10-12
      • 2020-03-17
      • 2020-07-07
      • 2023-03-31
      • 2020-11-21
      相关资源
      最近更新 更多