1

ログインシステムの作成と、パスワードの暗号化に crypt 関数を使用する作業を開始しました。私の問題は、ユーザーとパスワードを使用してユーザーを登録すると、すべてが機能し、ユーザー名のパスワードとソルトがデータベースに保存されることです。登録用のコードは次のとおりです。

注: 現時点では、これはテスト登録ページのみです。

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


$salt = substr(md5(microtime()),rand(0,26),15);
$hashedPass = crypt($password,'$2y$10$' . $salt);


$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`) VALUES (NULL,'$username','$hashedPass','$salt','test')";
$result=mysql_query($sql);

それは正しく暗号化されるので、実際の例では、パスワード テストは次のようになります。

そのソルトは次のものです:
d395985a2ca993f

データベースからソルトを取り出して同じ方法で再暗号化しようとしてもログインに行くと、別の暗号化されたパスワードを取得します...ソルトは正しく、パスワードの最初の部分も正しいので、この部分「$2y$10$d395985a2ca993f$$$$$$」

ログイン用のコードは次のとおりです。

$sql="SELECT * FROM `users` WHERE username='$user'";
$result=mysql_query($sql);

while($rows=mysql_fetch_array($result)){
$salt=$rows['salt'];
}

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

$sql="SELECT * FROM `users`WHERE username='$user' AND `password` = '$hashedPass'";
$result=mysql_query($sql);

    if($result) {
        if(mysql_num_rows($result) == 1) {
            echo "Successful Login";

        }
    }

ログインページのソルトは正しいですが、ハッシュ化後のパスワードは次のとおりです: $2y$10$d395985a2ca993f$$$$$$.ccy3PKl.TsG26FWJBFXKmpQ3wtk4AqC

終止符までの最初の部分は正しいですが、後半だけが異なります

ログオンおよび登録ページでのテストのためだけに abc や 123 のように手動でソルトを設定しようとしましたが、それでも同じエラーが発生します

4

2 に答える 2

0

値をデータベースに入れるときは、必ずエスケープしてください。

$escapeUserName= mysql_real_escape_string($username);
$escapeHashedPass= mysql_real_escape_string($hashedPass);
$escapeSalt= mysql_real_escape_string($salt);

$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`)
      VALUES (NULL,'$escapeUserName','$escapeHashedPass','$escapeSalt','test')"; 

そうしないと、特殊文字が正しく挿入されず、問題が発生する可能性があります。


これらの mysql 関数は非推奨であり、代わりに mysqli または PDO を使用する必要があることに注意してください。パラメータ化されたクエリを使用していれば、エスケープが処理されるため、これは決して起こらなかったでしょう。これにより、本質的にセキュリティが強化されます。古い機能に慣れる前に、新しい機能の使用を検討する必要があります。

于 2012-08-29T02:14:34.677 に答える
0

あなたのコードから、フグのハッシュを使用していることがわかります。

フグのハッシュを使用する場合、salt は base64 でエンコードする必要があり、その後「+」をドットに置き換える必要があります。

そしてあなたの塩は22文字の長さでなければなりません。

また、ベスト プラクティスは、次のような PHP ハッシュ パッケージを使用することですhttp://www.openwall.com/phpass/

正しいハッシュ関数をコーディングできる人はほとんどいません。非常に高度で専門的な知識が必要です。

于 2013-04-24T04:21:57.523 に答える