我正在尝试为我网站的用户创建动态化身。像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?
答案 0 :(得分:2)
由于这里的目标是使用散列来表示它的唯一性,而不是它的加密强度MD5是可以接受的。虽然我仍然不推荐它。
如果您确定使用MD5,请使用您控制的全局唯一ID,而不是用户提供的电子邮件地址,以及盐。
即
$salt = 'random string';
$hash = md5($salt . $userId);
然而:
您使用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,并确保您不会获得重复。