[英]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.