2016-08-15 3 views
1

塩漬けのハッシュをデータベースに保存できました。今私が直面している問題は、ログインするためにそれらを比較するように設定する方法です。ハッシュをもう一度作成する必要がありますか?そしてもし私がそれをもう一度作るのであれば、それは違うだろうか?今のチェックでは機能していると言われていますが、ハッシュされる前にパスワードでサインすることはできません。
次のコードは、IVEは、これまで試したものです:ハッシングと塩が正しく比較されない

$con = mysqli_connect($DB_HOST,$DB_USER,$DB_PASSWORD,$DB_DATABASE); 
if(!$con){ 
echo "Connection Error...".mysqli_connect_error(); 
} 
else 
{ 
//echo "Database connection Success..."; 
} 

$user_name =mysqli_real_escape_string($con, $_POST["login_name"]); 
$user_pass =mysqli_real_escape_string($con, $_POST["login_pass"]); 
$cost = 10; 
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'); 
$salt = sprintf("$2a$%02d$", $cost) . $salt; 


$sql_query = "select user_name,user_pass from user_info where 
user_pass ='$user_pass' and user_name = '$user_name'"; 


$hash = crypt($user_pass, $salt); 
if(crypt($user_pass,$hash)==$hash){ 
echo "works"; 
$result = mysqli_query($con,$sql_query); 
if(mysqli_num_rows($result) >0) 
{ 
$row = mysqli_fetch_assoc($result); 
$name = $row["name"]; 
echo "Login Success..Welcome " .$name; 
} 
else 
{ 
echo "Login Failed.......Try Again.."; 

} 
} 
+3

代わりに[password_hash](http://php.net/manual/en/function.password-hash.php)を使用することを検討する必要があります。ランダムな塩とハッシュと同じ文字列に格納 – Machavity

+2

また、[mcryptは死んだプロジェクトです](http://blog.remirepo.net/post/2015/07/07/About-libmcrypt-and-php-mcrypt) – Machavity

+0

@Machavity 7.1で削除され、削除のためにスロットに入れられていません:https://wiki.php.net/rfc/mcrypt-viking-funeral – BeetleJuice

答えて

2

あなたのログインは常に...このクエリので

"select user_name,user_pass from user_info where 
user_pass ='$user_pass' and user_name = '$user_name'" 

を失敗します...ハッシュ化され保存されたパスワードに、ユーザーの入力したパスワードを比較します。

より良いアプローチがある:(パスワードを無視して)ログインユーザ名と

  1. SELECT記録
  2. レコードが見つからない場合、ユーザ名が存在しません。失敗
  3. そのレコードのパスワードと送信されたパスワードを比較してください。
  4. 一致しない場合は、パスワードが間違っています。失敗します。
  5. ログインに成功しました。

PHPがこれをネイティブに提供する場合、独自のハッシングを実装しようとすると、あなたの人生は本当に困難になります。アカウント登録(ものと想定ユーザーは$clear_pwdを選んだ)でパスワードをハッシュするには:

$hash_pwd = password_hash($clear_pwd, PASSWORD_DEFAULT); 

これはあなたのために暗号化された安全な塩とハッシュを生成します。 $hash_pwdがDBに格納されます。今すぐログイン(パスワード確認)の手順3で、次のようにしてください:

if (password_verify($clear_pwd, $hash_pwd)){ 
    // $clear_pwd is correct 
}else{ 
    // password is incorrect. 
} 

シンプル!

+0

もしpassword_hashを追加すると、何もデータベースに挿入されません。私はそれ以外の方法(orignal方法)を行う場合それは動作します –

+0

OKので、PHPのプラグインがisnt 5.5を使用しているため、またはWebホストisnt 5.5のため、password_hashを使用することができます。 2人のうちの1人。 –

+0

@blahblahごめんなさい。これを制御できる場合は、PHPの更新を検討する必要があります。 PHP 5.5でもすでに使用期限を過ぎているので、古いバージョンでは問題はありません。 (https://en.wikipedia.org/wiki/PHP#Release_history) – BeetleJuice

関連する問題