2015-04-21 20 views
0

我的代碼實際上正在工作,但它一點都不安全,我不想使用MD5,因爲它不是那麼安全。我一直在查找密碼哈希,但我不知道如何將它合併到我的代碼中。如何使用密碼散列與PDO使我的代碼更安全?

登錄:

require_once __DIR__.'/config.php'; 
session_start(); 

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); 

$sql = "SELECT * FROM users WHERE username = :u AND password = :p"; 
$query = $dbh->prepare($sql); // prepare 
$params = array(":u" => $_POST['username'], ":p" => $_POST['password']); 
$query->execute($params); // execute 

$results = $query->fetchAll(); // then fetch 


//hash passwords pls 

if (count($results) > 0){ 
$firstrow = $results[0]; 
$_SESSION['username'] = $firstrow['username']; 
echo "Hello $username you have successfully logged in"; 
//header ("location:.php"); 
} 
else{ 
echo "Login Has Failed"; 
return; 
} 

註冊:

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 

$stmt = $dbh->prepare("insert into users set username='".$username."', email='".$email."', password='".$password."' "); 
$stmt->execute(); 
echo "<p>Thank you, you are registered</p>"; 

誰能告訴我如何將其納入我的代碼?

+0

是否[PHPass(http://www.openwall.com/phpass/)滿足您的需求? 關於合併,您在身份驗證時檢查哈希,並在創建帳戶時應用所需的哈希。 –

+1

旁註:你的註冊部分是不安全的。現在,我敢打賭,我可以在5分鐘內找到50條與此相關的鏈接。但那是你的工作。告訴我們你的嘗試。 –

+0

查看['password_hash()'](http://php.net/password_hash)。它內置於更新版本的PHP中。 – ircmaxell

回答

22

只需使用一個庫。認真。他們的存在是有原因的。

不要做自己。如果你正在創建自己的鹽,你做錯了。你應該使用一個庫來爲你處理。

$dbh = new PDO(...); 

$username = $_POST["username"]; 
$email = $_POST["email"]; 
$password = $_POST["password"]; 
$hash = password_hash($password, PASSWORD_DEFAULT); 

$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?"); 
$stmt->execute([$username, $email, $hash]); 

並會在登錄:

$sql = "SELECT * FROM users WHERE username = ?"; 
$stmt = $dbh->prepare($sql); 
$result = $stmt->execute([$_POST['username']]); 
$users = $result->fetchAll(); 
if (isset($users[0]) { 
    if (password_verify($_POST['password'], $users[0]->password) { 
     // valid login 
    } else { 
     // invalid password 
    } 
} else { 
    // invalid username 
} 
+1

我有一種感覺,你正在把某些東西(值得)放在一起。 –

+0

+100對於'他們存在是有原因的.' – fresher

+0

您正在比較用戶的輸入和存儲值以驗證登錄?這是行不通的。存儲的值是哈希值嗎? –

2

關於使代碼更安全

  • 你應該始終驗證用戶輸入,甚至從一個POST方法,可以通過提交表單前使用Firebug進行更改。因爲你是插入用戶輸入查詢,它更重要。

關於一般

正如我勸你在評論你的問題,使用PHPass或者已經取得的API這會爲您做的工作。

您將在帳戶創建時散列用戶名,密碼和鹽,並將散列插入到數據庫中。

在身份驗證時,您將使用給定的登錄名+密碼輸入和您添加以生成鹽的信息重新生成哈希。

如果兩個生成的哈希匹配,則用戶通過身份驗證。

編輯:是的password_hash也不錯。

+0

如果你正在創建你自己的鹽,你正在做一件可怕的事情錯誤。 – ircmaxell

-1

基本上,你有兩個選擇,在複雜變化的:

  • 商店註冊用戶密碼的哈希值,使用您所選擇的哈希算法(多進這個版本)。
  • 創建一個與用戶密碼一起使用的隨機salt(一個常量,祕密字符串),以創建上述散列,然後將該散列存儲在數據庫中。

當您檢索用戶記錄時,將從提供的密碼計算出的散列值與存儲在數據庫中的散列值進行比較。

例子:

$HashedPass = hash('sha512', $password); 

或預先定義的鹽

$HashedPass = hash('sha512', $password.SALT_STRING); 

存儲到DB這是你以前那樣。

在身份驗證完成類似:

$HashedPass = hash('sha512', $password.SALT_STRING); 

,然後基於散列相比,存儲一個從數據庫中檢索。現在

,我想,以解決有關的散列算法您的顧慮: 你不必使用MD5,你可以如用更安全的哈希算法,指的是在這裏評論: PHP's hash function 一個建議是使用sha512算法。

最重要的是,你應該明白,哈希是單向轉換 - 有反向工程從單純的哈希原來的密碼,也許只有尋找替代的字符串,其產生相同的散列串沒有切實可行的辦法。

我希望你找到一個強大的哈希算法,以及一個鹽減輕被盜的哈希數據庫的損害,足以滿足您的需求。