我正在生成用於帳戶激活的驗證碼。你以前可能看過這類東西。是一個隨機字符串良好的驗證碼
我的問題:如果我是一個複雜的公式是這樣生成的代碼:
md5(md5(time().'helloguys'.rand(0,9999)));
難道真的比任何產生的32個字符和數字像gj3dI3OGwo5Enf...
只是一個隨機字符串更好?
我正在生成用於帳戶激活的驗證碼。你以前可能看過這類東西。是一個隨機字符串良好的驗證碼
我的問題:如果我是一個複雜的公式是這樣生成的代碼:
md5(md5(time().'helloguys'.rand(0,9999)));
難道真的比任何產生的32個字符和數字像gj3dI3OGwo5Enf...
只是一個隨機字符串更好?
不,使用散列並不是更好。選擇32個隨機字符會更安全(不太可預測)。 (數字是字符)使用一個好的(「密碼」)隨機數生成器,一個好的種子(來自/ dev/random的一些字節)。不要用時間作爲種子。
同意埃裏克森,只是可能會建議你在* nix將工作muich任何程序的更好,你可以發明使用
pwgen -1 -s
命令。
如果你想生成一些字符串編程你可能看看
<?php
$better_token = md5(uniqid(rand(),1));
?>
這給隨機性非常好的水平,之前的衝突。
如果您需要安全的更高的水平,你可以考慮在http://www.random.org/
產生隨機序列,您可能要考慮base32編碼的結果,使其更容易爲你的用戶看起來有些相似的特徵區分字體。 – 2010-09-09 03:45:49
除了生成隨機值(即驗證碼)之外,如果2個用戶註冊並且意外生成完全相同的驗證碼,您可能需要處理這種情況。 如果唯一性很重要,我認爲即使是mt_rand()也可能不足。 – 2010-09-09 04:29:25
我認爲驗證碼將存儲在數據庫中 - 在列上放置一個唯一的密鑰,並在插入驗證碼之前,檢查它是否已經存在於數據庫中,並繼續生成新密鑰,直到找到一個以前沒有使用過。 – 2010-09-10 17:21:41