2011-10-06 57 views
0

現在我正在開發一個允許在線註冊的應用程序。對於開發,密碼檢查只檢查一個MySQL行,以確保該值與輸入字段中的值匹配。試圖圍繞PHP密碼圍繞鹽/加密

此代碼檢查,看看該行存在:

$res = mysql_query("SELECT * FROM `users` WHERE `username` = '".$username."' AND `password` = '".$password."'"); 
        $num = mysql_num_rows($res); 
        //check if there was not a match 
        if($num == 0){ 
         //if not display error message 
         echo "<center>The <b>Password</b> you supplied does not match the one for that username!</center>"; 

我感到困惑實施鹽業體制改革。我將如何改變這個腳本來檢查加密的密碼?我還沒有找到一個很好的教程,詳細解釋了這一點。

回答

2

鹽是一組字符添加到開始或加密和unencryption之前密碼的最終使其更難運行蠻力攻擊。

您首先創建的鹽只是一個隨機固定的一系列字符,然後在將其加密之前將其添加到密碼中。在將數據放入查詢之前,您還應該轉義您的數據以防止MySQL注入攻擊。

入關時到數據庫

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['pass']); 
$pass_hash = md5($SALT.$password); 
mysql_query(*query to insert $username and $pass_hash into db*) 

要檢查密碼是否正確

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['pass']); 
$res = mysql_query(*query to extract $pass_hash from db where username==$username) 
//get the password from the $res and put it in a var 
if(md5($SALT.$pass_hash_from_db) == $password){*correct pass*} else {*invalid login*} 

設置$ SALT一些大的隨機靜態的字符串,比如$鹽=「WEHGFHAWEOIfjo做到這一點; cewrxq#$%「;

+0

謝謝,這很有道理。 – user978905

0

如果用戶註冊並將其保存在數據庫中,您將不得不生成新的salt。

// you save this in the database 
$encPass = encFunction($password.$salt); 

當某個用戶想要登錄時,檢查該密碼是否是該用戶的密碼列。

注:
- encFunction是你的加密功能

+0

我想我主要想知道的是 - 什麼是鹽?它只是一個連接到sha1哈希的隨機字符串?我應該組成一個常量隨機的9個字符的字符串並將其添加到哈希中,然後對密碼檢查做同樣的事情嗎?我是否正確思考這個問題? – user978905

+0

是的;它應該是完全隨機的東西。 – MasterCassim