两个不同字符串的MD5是否可能相同?

时间:2016-04-25 01:57:27

标签: php email hash avatar

我正在尝试为我网站的用户创建动态化身。像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?

2 个答案:

答案 0 :(得分:2)

由于这里的目标是使用散列来表示它的唯一性,而不是它的加密强度MD5是可以接受的。虽然我仍然不推荐它。

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

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

然而:

  • 由于Birthday Paradox,碰撞的可能性仍然很小(从2 128 开始并且接近2 64 相对较快)。请记住,这是偶然,哈希 n 和哈希 n + 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 :(得分:1)

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

在实践中碰撞的可能性微不足道,故意伪造两个(二进制)字符串很难,导致相同的MD5和电子邮件的大小和字符受到限制。

这种方法的一个问题是Fred-ii提到的问题,因为MD5的强制执行速度如此之快(100 Giga MD5 per second),有人可能会尝试找到原始电子邮件地址,其MD5现在可见。对于简短的电子邮件,这将在合理的时间内工作。

使用UUID可能是从电子邮件地址中获取的好方法。您可以在没有数据库访问权限的情况下创建此类ID,并确保您不会获得重复。