-1

Web サイトでユーザーを登録するときに、パスワードをハッシュするこの方法があります。私が知る限り、これは完全に機能します。データベースに $password_hash と $salt を保存しています。しかし、ログインのためにユーザーを認証しようとすると問題が発生し、取得したハッシュが一致しません。

登録機能

$salt = createSalt();
$password = createPassword();
$hash = hash('sha256', $password);
$password_hash = hash('sha256', $salt . $hash);

ログイン機能

$query = "SELECT Password_Hash,Salt FROM accounts WHERE Email = ' ".$email." ' ";
$result = mysqli_query($mysqli, $query);
$rows = mysqli_fetch_assoc($result);
$hash = hash('sha256', $password);
$password_hash = hash('sha256', $rows['Salt'] . $hash);

パスワード作成機能

function createPassword()
{ /*This function is used to create the password for the user */
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    for ($i = 0; $i < 8; $i++) 
    {
        $n = rand(0, strlen($alphabet)-1);
        $pass[$i] = $alphabet[$n];
    }
    return implode($pass);
}

2 つのパスワード ハッシュが一致しません。私が間違っていることはありますか?出力の下の画像。最初の行は DB 出力です ここに画像の説明を入力

4

3 に答える 3

0

パスワードをハッシュするとき、これは 3 つのよくある間違いです

  • 大文字と小文字の区別
  • ホワイトスペース

trimハッシュされる前および認証前のパスワードを使用してみてください。

 echo hash('sha256', "pass"); //d74ff0ee8da3b9806b18c877dbf29bbde50b5bd8e4dad7a3a725000feb82e8f1

echo hash('sha256', " pass"); //f2752b292e1333b2d224a1f831e3ce866dbfc7a32da2af4d1092135f5a2c9383
                     ^----- Just this space makes a huge diffrence

編集

http://pastebin.com/4NtuANzjからvar_dump

登録時

$password_hash =   string(64) "f8fe50b60e3c71dbcc805484352b449df06b2a810cf7d93294e644093a6f60ac" ;

$db_pass_hash = $rows['Password_Hash'];

$db_pass_hash =  string(66) " f8fe50b60e3c71dbcc805484352b449df06b2a810cf7d93294e644093a6f60ac "
                             ^---- empty space

解決

$db_pass_hash = trim($rows['Password_Hash']);
$db_salt = trim($rows['Salt']);
于 2012-10-24T17:19:40.203 に答える
0

次の 2 つの可能性があります。

  • 間違ったソルトを保存しています(とにかく、データベースにソルトを保存しないでください)
  • 別のパスワードを入力しています...

ユーザー データからソルト アウトを作成することを強くお勧めします。次に例を示します。

$salt = $userEmail . $userID . 'yourString';

そして、このソルトをデータベースに入れないでください。その場で毎回計算するだけです。また、ソルトをハッシュする必要もありません。次のように直接連結できます。

$hash = hash( $password . $salt );
于 2012-10-24T17:10:07.357 に答える