簡體   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