0

私のウェブサイトにサインアップする場合、パスワードをハッシュ化しようとしていますが、うまくいきません。これは、サインアップ時にパスワードをハッシュするための私のコードです:

$escapedName = mysql_real_escape_string($_POST['user']); 
$escapedPW = mysql_real_escape_string($_POST['password']);

$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$hashedPW = hash('sha256', $escapedPW . $salt);

次に、それをデータベースに挿入します (ハッシュ化されたパスワードとソルト)。たとえばSas、次のソルトを使用してハッシュすると、次のようになります。
abac7ad23185ad19967f0d13e962197962782f0b7ec32d9889c27a93a9e800fa
これはハッシュされたパスワードです。
8ca5c5f31fafbf382533dbcbfc22b3635d776ec7770c7eac58d8ef9f1fa3613c

しかし、まったく同じパスワードとソルトを使用して、ログイン時にパスワードをハッシュしようとすると、これがハッシュされたパスになります。
6eb4b16444f18cee19db32bd29a39970e3019c5b1972a982ae4cb9a59642dffc

これは、ログインに使用するコードです。

$escapedName = mysql_real_escape_string($_POST['user']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = mysql_query("SELECT salt FROM members WHERE user='{$escapedName}'");
while($result = mysql_fetch_assoc($saltQuery)) {
    $salt = $result['salt'];
}

$hashedPW = hash('sha256', $escapedPW . $salt);

$sql = mysql_query("SELECT * FROM members WHERE user='$escapedName' AND pass='$hashedPW'; ");
while ($res = mysql_fetch_assoc($query2)) {
    $username = $res['user'];
    $PW = $res['pass'];
}

コードが多すぎないことを願っています。また、私の質問を理解していただけることを願っています。

4

3 に答える 3

1

申し訳ありませんがコメントできませんがsalt、データベースの列に長さの制限があるとのことです。

例:saltフィールドは64文字しか許可しない場合がありますが、生成されたsaltはそれより長くなる可能性があるため、saltを保存するとトリミングされ、最終的にハッシュされたパスワードが変更されます。

その場合は、保存する前に塩をトリミングすることをお勧めします。

PDOを使用してデータベースに対してクエリを実行することをお勧めします。

于 2013-03-13T21:27:07.557 に答える
1

ハッシュ関数への入力は、何らかの理由で異なる必要があります。

両方のユース ケース (ユーザーの作成とログイン) でハッシュする前に、入力を出力するログ出力メッセージを追加します。また、空白の問題を示すために、ログの入力を必ず引用符で囲んでください。

どちらの場合も、生の入力とハッシュ関数の出力を比較すると、どこかに違いがあります。違いがなく、ハッシュの出力が同じである場合は、ログイン ケースでユーザーを検索しているクエリに問題があります。

于 2013-03-13T21:34:39.897 に答える
0

何をしていても、ハッシュを同じにしたい場合は安全ではありません! 適切なパスワードハッシュについては、 http://php.net/cryptを参照してください。

必要なもの:

function check_password($password) {  
    ...//get db password to compare
    if (crypt($post_password, $db_results[0]['password']) == $db_results[0]['password']) {  
        return true;  
    } else { return false; }
}
于 2013-03-13T21:19:56.813 に答える