2013-05-17 91 views
0

我試圖驗證數據庫中的密碼,但它不起作用。 請看我的代碼,讓我知道什麼是錯的。密碼使用bcrypt驗證數據庫

將用戶名和密碼存儲到數據庫的代碼。

<?php 

echo "enter the username \n"; 

$username = trim(fgets(STDIN)); 

echo "enter the password\n"; 

$password = trim(fgets(STDIN)); 

//connecting to database 

$con=mysqli_connect("localhost","sqldata","sqldata","accounts"); 
// Check connection 
if (mysqli_connect_errno()) 
{ 
echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$salt = substr(sha1(mt_rand()),0,22); 

$hashedPassword= crypt($password , '$2y$10$' . $salt); 

echo $hashedPassword; 

mysqli_query($con,"INSERT INTO login (username, password) 
VALUES ('$username', '$hashedPassword')"); 

mysqli_close($con) 

?> 

代碼驗證密碼是如下

<?php 


echo "enter the username \n"; 

$username = trim(fgets(STDIN)); 

echo "enter the password\n"; 

$password = trim(fgets(STDIN)); 

//connecting to database 

$db = mysql_connect("localhost","sqldata","sqldata") or die(mysql_error()); 


//selecting our database 

$db_select = mysql_select_db("accounts", $db) or die(mysql_error()); 

$result= mysql_query("select * from login where username = '$username' "); 

if (!$result) exit("$userName wasn't found in the database!"); 
$row = mysql_fetch_array($result); 

$storedPassword = $row['password']; 

$salt = substr(sha1(mt_rand()),0,22); 

$hashedPassword= crypt($password , '$2y$10$' . $salt); 

if (crypt($hashedPassword) == $storedPassword) 
{ 
echo "ok"; 
} 
else 
{ 
echo "error"; 
} 
?> 

回答

1

當你的密碼保存您對數據庫使用的是:

$hashedPassword= crypt($password , '$2y$10$' . $salt); 

但是當你找回密碼,並檢查它我看到一些錯誤的東西:

$storedPassword = $row['password']; 

$salt = substr(sha1(mt_rand()),0,22); 

$hashedPassword= crypt($password , '$2y$10$' . $salt); 

if (crypt($hashedPassword) == $storedPassword){/*...*/} 

1,切忌:

$hashedPassword= crypt($password, '$2y$10$' . $salt);

$hashedPassword= crypt($storedPassword, '$2y$10$' . $salt);

2,看樣子,你正在使用crypt兩次:

$hashedPassword= crypt($password , '$2y$10$' . $salt); 
if (crypt($hashedPassword) == $storedPassword) 

所以不宜IS只是:

$hashedPassword= crypt($storedPassword, '$2y$10$' . $salt); 
if ($hashedPassword == $storedPassword){/*...*/} 
+0

對不起,你的方法不起作用。我試過,但它給我回聲錯誤$ storedPassword = $ row ['password']; $ salt = substr(sha1(mt_rand()),0,22); $ hashpassword = crypt($ storedPassword,'$ 2y $ 10 $'。$ salt); if($ hashpassword == $ storedPassword) { echo「ok」; } else { echo「error」; } ?> – hadi

+0

有人可以幫忙關注這個問題。預先感謝。 – hadi

1

這比你想象的要簡單。密碼格式有點聰明:它包含salt作爲密碼的開頭,形式爲(method)(salt)(hash)。當使用crypt()時,它只會查看(method)(salt)並使用它們返回(method)(salt)(hash),所以要驗證一個密碼,所有你需要做的就是pass將加密的密碼作爲鹽並查看結果是否匹配。也就是說,

crypt($testPassword, $hashedPassword) === $hashedPassword 
+0

謝謝你使用'crypt($ testPassword,$ hashedPassword)=== $ hashedPassword' – hadi

相關問題