0

ユーザーがパスワードを挿入できる登録ページがあります。登録時にパスワードをハッシュして、データベースにより安全に保存します。

ユーザーが同じパスワードでログインすると、2 つのハッシュが一致せず、ユーザーはログインできません。

ハッシュを使用するのはこれが初めてで、期待どおりに動作しませんでした。

これは、登録ページのハッシュ コードです。

$salt ="";     
function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass1);      
echo $hashedpass;
//************Insert all the members's input to the database**************************//
      $query = mysql_query("INSERT INTO members(user_name, first_name, last_name, governorate, district, village, birth_date, email_address, specialization, password, salt, registered_date )VALUES('$username', '$firstname', '$lastname', '$governorate', '$district', '$village', '$bdate', '$email', '$specialization', '$hashedpass', '$salt',  now())")or die(mysql_error());    

私は塩を加えましたが、それは空になります

これは、ログイン ページのハッシュ コードです。

function cryptPass($input, $rounds = 9)
{
    $salt = "";
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9'));
    for($i = 0; $i<22; $i++)
    {
        $salt  .=$saltChars[array_rand($saltChars)]; 
    }
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt);
}
$hashedpass = cryptPass($pass);   
echo $hashedpass;


$sql=mysql_query( "SELECT user_id, email_address, first_name, user_name FROM members WHERE email_address='$email'AND password= '$hashedpass' LIMIT 1") or die("error in members table");
$login_check = mysql_num_rows($sql);

  if($login_check > 0)the hashing password = $2y$09$test$4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e 
4

4 に答える 4

0

パスワードのソルティングは、パスワードをハッシュする前に、事前に定義されたランダムな平文のセットをパスワードに追加することで機能します。これにより、同じパスワードを選択した 2 人のユーザーに対して 2 つの同一のハッシュが作成されることを回避できます。システムの 2 人のユーザー user1 と user2 が、パスワードとして「 letmein 」を選択したとします。

salt_user1 = 'awoidjalskdm'   
hash = MD5('letmein'+salt_user1) = ab82a9c495e3fe88d1986176e4850b1d

そしてuser2の場合

salt_user2 = 'duiesnblekfn'
hash = MD5('letmein'+salt_user2) = 69caac44b5ee9f8b6468b5625000723a

データベース構造が username:salt:password_hash に沿ったものであると仮定すると、次のようになります。

user1:awoidjalskdm:ab82a9c495e3fe88d1986176e4850b1d
user2:duiesnblekfn:69caac44b5ee9f8b6468b5625000723a

パスワード ソルティングの主な目的は、データベースが侵害された場合に大量のパスワード侵害を回避することです。パスワードのソルティングにより、複数の異なるユーザーが選択する単純で一般的なパスワードを総当たり攻撃することが難しくなります。

あなたの場合、登録のためにソルトをランダムに生成しているようです (これは良いことです)。間違いは、以前に生成されて保存されているはずのソルトを取得する代わりに、ランダムなソルトを再計算するログイン機能にあるようです。

ハッシュする前にパスワードに追加するソルトは、各ユーザーで同じにする必要があり、必要なときに思い出せるようにする必要があります。矛盾しているように見えるかもしれませんが、これはデータベースにプレーンテキストで保存する必要があることを意味します。

于 2013-05-19T16:24:30.647 に答える