2016-04-25 88 views
1

我正在嘗試爲我的網站用戶創建一個動態頭像。有點像stackoverflow。我有一個基於字符串的圖像的PHP腳本:是否有可能兩個不同字符串的MD5是相同的?

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

是的,這是可能的,約1萬億機會中的1。 – AbraCadaver

+0

@AbraCadaver那麼我該如何生成一個唯一的字符串?在將他的信息插入數據庫之前,我不訪問用戶的'id'。 – Shafizadeh

+0

一個加密專家會來和正確的,但如果你只是想混淆電子郵件地址的MD5可能是好的。你也可以使用SHA256或512. – AbraCadaver

回答

2

由於這裏的目標是使用散列來表示它的唯一性,而不是密碼強度,所以MD5是可以接受的。雖然我仍然不會推薦它。

如果您確實使用MD5,請使用您控制的全局唯一ID而不是用戶提供的電子郵件地址以及salt。

$salt = 'random string'; 
$hash = md5($salt . $userId); 

然而:

  • 仍然有碰撞的可能性很小(開始於2 和接近2 相對快速地由於Birthday Paradox)。請記住這是一個的機會,散列號 n和散列號 n + 1可能發生碰撞。
  • 沒有一個合理的方法來從散列中確定userId(我不考慮索引128位散列,因此您可以查詢它們是合理的)。

您使用StackOverflow作爲示例。本網站

用戶配置文件的樣子:http://stackoverflow.com/users/2805376/shafizadeh

那麼,什麼是錯與具有類似http://your_site/users/2805376/avatar.png頭像的網址?後端存儲可能僅僅是/path/to/images/002/805/376.png

這保證了唯一的名稱,併爲您提供一個非常簡單和容易儲存,定位和倒車分配給圖像傳回給用戶的ID的工作方式。

+0

很好的解釋。 Thx ... +1 – Shafizadeh

+0

也是這句話:*那麼有什麼不好的頭像網址喜歡'http://your_site/users/2805376/avatar.png'*。我必須說,SO使用用戶的ID作爲他的頭像的名字。我真的不知道它是怎麼做到的,因爲當用戶沒有在我的網站上註冊時,他沒有ID,在註冊他之前我需要他的頭像的名字。 – Shafizadeh

1

這實際上是Gravatar正在做的事情(這是在Stackoverflow中獲得頭像的標準方法)。看看Gravatars implementation

在實踐中碰撞的可能性可以忽略不計,故意僞造導致相同MD5的兩個(二進制)字符串非常困難,並且EMails的大小和字符受到限制。

這種方法的一個問題是Fred-ii提到的問題,因爲MD5的暴力攻擊太快了(100 Giga MD5 per second),有人可以嘗試找到其原始電子郵件地址,其MD5現在可見。對於簡短的電子郵件,這將在合理的時間內工作。

使用UUID可能是從電子郵件地址獲取信息的不錯選擇。你可以創建這樣一個沒有數據庫訪問的id,並確保你不會得到重複。

+0

Thx ........ +1 – Shafizadeh

相關問題