繁体   English   中英

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

[英]Is it possible the MD5 of two different strings be identical?

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

因为这里的目标是使用哈希来获得它的唯一性而不是它的加密强度MD5是可以接受的。 虽然我仍然不推荐它。

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

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

然而:

  • 碰撞的可能性很小(由于生日悖论,从2 128开始并且相对快速地接近2 64 )。 记住这是一个机会 ,哈希n和哈希n + 1可能会发生碰撞。
  • 没有合理的方法从散列中确定userId(我不考虑索引128位散列,因此您可以查询它们是否合理)。

您使用StackOverflow作为示例。

此站点上的用户配置文件如下所示: http://stackoverflow.com/users/2805376/shafizadehhttp://stackoverflow.com/users/2805376/shafizadeh

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

这保证了一个独特的名称,并为您提供了一种非常简单易用的方法,可以将分配给图像的id存储,定位和反转回用户。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM