两个不同字符串的 MD5 是否可能相同?
Is it possible the MD5 of two different strings be identical?
我正在尝试为我网站的用户创建一个动态头像。像计算器一样的东西。我有一个 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);
但是:
- 仍有小概率发生碰撞(从 2128 开始,相对较快地接近 264 由于 Birthday Paradox).请记住这是一个 机会,hashn 和 hashn+1 可能会发生冲突。
- 没有合理的方法从哈希中确定 userId(我不考虑索引 128 位哈希,因此您可以合理地查询它们)。
您以 Whosebug 为例。
此网站上的用户个人资料如下:http://whosebug.com/users/2805376/shafizadeh
那么像 http://your_site/users/2805376/avatar.png
这样的头像 url 有什么问题呢?后端存储可以简单地是 /path/to/images/002/805/376.png
这保证了唯一的名称,并为您提供了一种非常简单且易于使用的存储、定位和反转分配给图像的 ID 的方式返回给用户.
这实际上是 Gravatar 正在做的事情(这是在 Whosebug 中获取头像的标准方式)。看看 Gravatars implementation.
在实践中发生冲突的可能性可以忽略不计,故意伪造两个(二进制)字符串导致相同的 MD5 并且 EMails 在大小和字符方面受到限制。
这种方法的一个问题是 Fred-ii- 提到的,因为 MD5 的暴力破解非常快 (100 Giga MD5 per second),有人可以尝试找到原始电子邮件地址,其 MD5 现在是可见的.对于简短的电子邮件,这会在合理的时间内起作用。
使用 UUID 可能是从电子邮件地址派生的一个很好的替代方法。您可以在没有数据库访问权限的情况下创建这样的 ID,并确保您不会得到重复的。
我正在尝试为我网站的用户创建一个动态头像。像计算器一样的东西。我有一个 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);
但是:
- 仍有小概率发生碰撞(从 2128 开始,相对较快地接近 264 由于 Birthday Paradox).请记住这是一个 机会,hashn 和 hashn+1 可能会发生冲突。
- 没有合理的方法从哈希中确定 userId(我不考虑索引 128 位哈希,因此您可以合理地查询它们)。
您以 Whosebug 为例。
此网站上的用户个人资料如下:http://whosebug.com/users/2805376/shafizadeh
那么像 http://your_site/users/2805376/avatar.png
这样的头像 url 有什么问题呢?后端存储可以简单地是 /path/to/images/002/805/376.png
这保证了唯一的名称,并为您提供了一种非常简单且易于使用的存储、定位和反转分配给图像的 ID 的方式返回给用户.
这实际上是 Gravatar 正在做的事情(这是在 Whosebug 中获取头像的标准方式)。看看 Gravatars implementation.
在实践中发生冲突的可能性可以忽略不计,故意伪造两个(二进制)字符串导致相同的 MD5 并且 EMails 在大小和字符方面受到限制。
这种方法的一个问题是 Fred-ii- 提到的,因为 MD5 的暴力破解非常快 (100 Giga MD5 per second),有人可以尝试找到原始电子邮件地址,其 MD5 现在是可见的.对于简短的电子邮件,这会在合理的时间内起作用。
使用 UUID 可能是从电子邮件地址派生的一个很好的替代方法。您可以在没有数据库访问权限的情况下创建这样的 ID,并确保您不会得到重复的。