2014-10-03 95 views
0

我只想通過將註冊date_time作爲鹽來散列我的用戶密碼。我打算使用這個功能:雖然註冊獲取註冊日期時間和散列它

function create_hash($pass, $created_date, $hash_method = 'md5') { 
// the salt will be the reverse of the user's created date 
// in seconds since the epoch 
$salt = strrev(date('U', strtotime($created_date)); 
if (function_exists('hash') && in_array($hash_method, hash_algos()) { 
    return hash($hash_method, $salt.$pass); 
} 
return md5($salt.$pass); 
} 

還有類似的密碼驗證方法。但我正在考慮註冊過程。在我的註冊表中,我只有用戶名和密碼字段,在我的mysql數據庫中,創建日期將自動添加。

但是,當第一次註冊時,我還需要用於散列密碼的creation_date?如何克服這一點?所以基本上我想象着在數據庫中插入數據進行鹽析之前,我必須獲取creation_date。這個怎麼做?

一種方法,我想,在我的登記表調用此函數之前,我會做到這一點:

$created_date = date("Y-m-d H:i:s"); 
$salt = strrev(date('U', strtotime($created_date)); 

但恐怕是有將是這種鹽的時間和CREATION_DATE時間之間的一小部分時間差的數據庫。如果是這樣,那麼我的password_validation將無法正常工作。

***我知道md5()是不安全的。所以我不需要關於md5或其他哈希算法的建議。我對醃製

回答

0

Maeby是更好的主意,編寫創建鹽的功能只是感興趣

function salt($n=3) 
{ 
    $key = ''; 
    $pattern = '1234567890abcdefghijklmnopqrstuvwxyz.,*_-=+#@!&^%'; 
    $counter = strlen($pattern)-1; 
    for($i=0; $i<$n; $i++) 
    { 
     $key .= $pattern{rand(0,$counter)}; 
    } 
    return $key; 
} 

,當新用戶註冊調用打開了該功能,做這樣的事情:

$salt=salt(); 
$hash_pass=md5(md5($_POST['password']).$salt); 
mysql_query("INSERT INTO `my_table` SET `name`='".$_POST["name"]."', `pass`='".$hash_pass."' `regDate`=NOW() "); 

當用戶沉迷時,您從表中選擇用戶數據作爲名稱,並將他的散列密碼與張貼的密碼與他的鹽相比較

+0

我也有我的隨機鹽..我想使用用戶創建日期作爲第二個鹽 – oxvoxic 2014-10-03 07:11:14

+0

看你有多少不同的函數來創建一個哈希密碼,我提供了雙哈希方法,不會消耗太多內存。你可以在你的查詢中發佈你的變量$ date_time並且不要調用一個mysql函數NOW(),並且時間上沒有什麼區別 – Snowman 2014-10-03 07:19:08

+0

它也出現在我腦海中,我可以使用特殊字符作爲胡椒進行md5散列。特殊字符可能是製表鍵,esc鍵或多個空格?如果是這樣怎麼辦?它是這樣的:md5(''。$ text); – oxvoxic 2014-10-03 14:19:10

0

最好的sa你可以擁有,不受任何其他參數的驅使,並且不可預測。在確定性的計算機上,你可以做的最好的事情是從操作系統的隨機源獲得鹽。這個隨機源將收集來自用戶操作,啓動時間等事件的真實機會...

PHP已經有一個專用的函數password_hash()用這樣的隨機鹽生成安全的BCrypt哈希。它將salt包含到生成的散列值中,因此可以將它存儲到數據庫中的單個字段中。

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

使用胡椒也是一個好主意,但也有更好的方法來添加這樣的服務器端機密。無論你的胡椒是否含有特殊字符或更長時間無關緊要,熵都很重要。如果你有興趣,你可以看看我的教程secure password storing,最後幾頁我試圖解釋胡椒的利弊。

+0

Password_hash很好,易於實現。 。我知道..但現在我對password_hash不感興趣。嘗試加強舊的md5 – oxvoxic 2014-10-04 10:24:07

+0

@oxvoxic - 一個如何生成安全鹽的例子,你可以在這裏找到(http://www.martinstoeckli.ch/php/php.html#bcrypt),搜索方法' generateRandomBase64String()'。我對使用MD5的理由感興趣,也許你可以多解釋一下?爲了加強這個算法,你必須使用密鑰伸展,這意味着使用許多MD5迭代,當然,我不能推薦這個。 – martinstoeckli 2014-10-04 10:34:30