[英]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);
然而:
您使用StackOverflow作为示例。
此站点上的用户配置文件如下所示: http://stackoverflow.com/users/2805376/shafizadeh
: http://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.