2010-09-09 15 views
7

我正在生成用於帳戶激活的驗證碼。你以前可能看過這類東西。是一個隨機字符串良好的驗證碼

我的問題:如果我是一個複雜的公式是這樣生成的代碼:

md5(md5(time().'helloguys'.rand(0,9999))); 

難道真的比任何產生的32個字符和數字像gj3dI3OGwo5Enf...只是一個隨機字符串更好?

+0

產生隨機序列,您可能要考慮base32編碼的結果,使其更容易爲你的用戶看起來有些相似的特徵區分字體。 – 2010-09-09 03:45:49

+0

除了生成隨機值(即驗證碼)之外,如果2個用戶註冊並且意外生成完全相同的驗證碼,您可能需要處理這種情況。 如果唯一性很重要,我認爲即使是mt_rand()也可能不足。 – 2010-09-09 04:29:25

+0

我認爲驗證碼將存儲在數據庫中 - 在列上放置一個唯一的密鑰,並在插入驗證碼之前,檢查它是否已經存在於數據庫中,並繼續生成新密鑰,直到找到一個以前沒有使用過。 – 2010-09-10 17:21:41

回答

6

不,使用散列並不是更好。選擇32個隨機字符會更安全(不太可預測)。 (數字是字符)使用一個好的(「密碼」)隨機數生成器,一個好的種子(來自/ dev/random的一些字節)。不要用時間作爲種子。

+2

我打算用for循環生成32個隨機字符。這種方法有什麼問題?對於一個正常的網站進行帳戶驗證,這不是很好嗎? (我的意思是即使我是推特或其他東西,對於手頭的目的來說,這樣做還不錯) – dave 2010-09-09 03:38:30

+0

+1完全同意。 – rook 2010-09-09 04:18:11

+0

是的,我認爲在for for循環中每次選擇一個字母都可以,只要RNG很好就沒關係。這對任何網站都有好處(可能需要更多的字符)。 – erickson 2010-09-09 04:23:50

1

同意埃裏克森,只是可能會建議你在* nix將工作muich任何程序的更好,你可以發明使用

pwgen -1 -s 

命令。

如果你想生成一些字符串編程你可能看看

<?php  
$better_token = md5(uniqid(rand(),1)); 
?> 

這給隨機性非常好的水平,之前的衝突。

如果您需要安全的更高的水平,你可以考慮在http://www.random.org/