【问题标题】:Is it possible the MD5 of two different strings be identical?两个不同字符串的MD5是否可能相同?
【发布时间】:2016-08-18 06:40:26
【问题描述】:

我正在尝试为我的网站用户创建动态头像。类似stackoverflow的东西。我有一个基于字符串生成图像的 PHP 脚本:

path/to/avatar.php?hash=string

我想使用用户电子邮件的 MD5 作为他们头像的名称:(并且 PHP 脚本根据该字符串生成图像)

$email = $_GET['email'];
$hash  = md5($email);
copy("path/to/avatar.php?hash=$hash","path/img/$hash.jpg");

现在我想确定一下,我可以使用他们电子邮件的 MD5 作为他们头像的名称吗?我的意思是不是有两个不同的字符串具有相同的 MD5 输出吗?换句话说,我想知道两个不同字符串的输出是否是唯一的?

我不知道我的问题是否清楚......我只想知道,是否有可能复制两封不同电子邮件的 MD5?

【问题讨论】:

  • 是的,这是可能的,大约 1 万亿分之一的机会。
  • @AbraCadaver 那么如何生成唯一的字符串?在将用户信息插入数据库之前,我不会访问用户的id
  • 一位加密专家会过来纠正,但如果你只是想混淆电子邮件地址,MD5 可能没问题。您也可以使用 SHA256 或 512。
  • 它们被称为“哈希冲突”。看看stackoverflow.com/questions/1224113/examples-of-hash-collisions
  • 我不会使用 md5 来散列电子邮件。如果有人使用彩虹桌怎么办?即时垃圾邮件

标签: php email hash avatar


【解决方案1】:

因为这里的目标是使用哈希值而不是它的加密强度,所以 MD5 是可以接受的。虽然我还是不推荐。

如果您决定使用 MD5,请使用您控制的全局唯一 ID,而不是用户提供的电子邮件地址以及 salt。

$salt = 'random string';
$hash = md5($salt . $userId);

但是:

  • 仍有小概率发生碰撞(从 2128 开始,由于Birthday Paradox 而相对较快地接近 264)。请记住,这是一个机会,hashn 和 hashn+1 可能会发生冲突。
  • 没有一种合理的方法可以从哈希中确定 userId(我不考虑索引 128 位哈希,因此您可以查询它们是否合理)。

你以 StackOverflow 为例。

此站点上的用户个人资料如下所示:http://stackoverflow.com/users/2805376/shafizadeh

那么像http://your_site/users/2805376/avatar.png 这样的头像网址有什么问题呢?后端存储可以简单地是/path/to/images/002/805/376.png

这保证了名称的唯一性,并为您提供了一种非常简单且易于使用的方式来存储、定位和反转分配给图像的 ID 给用户。

【讨论】:

  • 很好的解释。谢谢... +1
  • 也适用于这句话:那么像http://your_site/users/2805376/avatar.png这样的头像网址有什么问题。我不得不说,SO 使用用户的 id 作为他的头像的名称。我真的不知道它是怎么做到的,因为当用户没有在我的网站上注册时,所以他没有 id,在注册之前我需要他的头像的名字。
【解决方案2】:

这实际上是 Gravatar 正在做的事情(这是在 Stackoverflow 中获取头像的标准方法)。看看Gravatars implementation

在实践中发生冲突的可能性可以忽略不计,故意伪造两个(二进制)字符串导致相同的 MD5 和电子邮件的大小和字符受到限制已经足够困难了。

这种方法的一个问题是 Fred-ii- 提到的,因为 MD5 的暴力破解非常快 (100 Giga MD5 per second),有人可以尝试找到原始电子邮件地址,其 MD5 现在是可见的。对于简短的电子邮件,这将在合理的时间内起作用。

使用UUID 可能是从电子邮件地址派生的一个很好的替代方案。您可以在没有数据库访问权限的情况下创建这样的 id,并确保不会重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多