1

今のところ、MysSqlデータベースで同じパスワードかどうかを確認しようとしています。しかし、私は失敗していて、理由がわかりません。

$username = 'blablabla';
$password = 'blablabla.';
$salt = 'blablabla';
$new = md5($password.md5($salt));
echo($new);
$q=mysql_query("SELECT * FROM mdl_user WHERE username = '$username' AND password = '$new'");
while($e=mysql_fetch_assoc($q))
    $output[]=$e;
print(json_encode($output));

ソルトワードを定義する設定ファイルでは、上記と同じように使用しました。

編集:このコードからハッシュアルゴリズムを取得することは可能ですか?

function validate_internal_user_password($user, $password) {
global $CFG; 
if (!isset($CFG->passwordsaltmain)) { 
$CFG->passwordsaltmain = ''; 
} 
$validated = false; 
if ($user->password === 'not cached') { 
// internal password is not used at all, it can not validate 
} else if ($user->password === md5($password.$CFG->passwordsaltmain) 
    or $user->password === md5($password) 
    or $user->password === md5(addslashes($password).$CFG->passwordsaltmain) 
    or $user->password === md5(addslashes($password))) { 
// note: we are intentionally using the addslashes() here because we 
//       need to accept old password hashes of passwords with magic quotes 
$validated = true; 
} else { 
for ($i=1; $i<=20; $i++) { //20 alternative salts should be enough, right? 
    $alt = 'passwordsaltalt'.$i; 
    if (!empty($CFG->$alt)) { 
        if ($user->password === md5($password.$CFG->$alt) or $user->password === md5(addslashes($password).$CFG->$alt)) { 
            $validated = true; 
            break; 
        } 
    } 
} 
} 
if ($validated) { 
// force update of password hash using latest main password salt and encoding if needed 
update_internal_user_password($user, $password); 
} 
return $validated; 

編集 私はこのコードを試しました:

$username = 'admin';
$password = 'Vidsodis25.'+'Karolina';
$new = md5($password);
echo($new);
$q=mysql_query("SELECT * FROM mdl_user WHERE password = '$new'");
while($e=mysql_fetch_assoc($q))
    $output[]=$e;
print(json_encode($output));

データベースは同じソルトワードKarolinaを使用しています。しかし、それでも正しいものを見つけることができません。

4

1 に答える 1

1

他の人がコメントで言ったように、次のいずれかです。

  1. パスワード/名前/ソルトが正しくありません(入力が正しくありません)
  2. ハッシュが正しくありません(異なる方法で、または異なるソルトで生成されます)
  3. 特定のユーザーのハッシュが正しくありません(たとえば、一致しない、レコードがないなど)

さて、ハッシュが行われる方法は...間違っているように見えます。ソルトのアイデアは、レインボーテーブル攻撃を阻止することです。これにより、攻撃者はブルートフォースに依存して特定のパスワードを「クラック」する必要があります。

とにかく、保存された新しいパスワードハッシュごとに、新しいランダムソルト値(たとえば、128ビット以上)を生成します。このユニークなナンスは、ハッシュされるにパスワードをソルトするために使用されます。次に、ハッシュソルトが一緒に保存されます(これらは多くの場合、値に結合されますが、別々の列にある場合は問題ありません)。

したがって、パスワードが有効であることを確認するには、次のようにします。

  1. 最初にユーザーを表す行を見つけて、ハッシュソルトを抽出します
  2. ソルトを使用してパスワードからハッシュを生成します。ハッシュ/ソルトが結合値として保存された場合は、必要に応じて最初に分離します
  3. 生成されたハッシュと保存されたハッシュを確認します

つまり、正しいハッシュを再度生成するにはソルトが使用可能である必要があるため、クエリは検索しないusername = '$username' AND password = '$new'"可能性があります(password実際に呼び出される場所など)。上記のコードスニペットでは、20個の異なるプリセットソルトを使用してサルのビジネスを行っています。これは正しい方法ではなく、「正しいハッシュ」を見つけることができるように、潜在的なソルトのそれぞれをハッシュ生成で使用する必要があります。(投稿に翻訳すると、これには最大20の異なる実行および/または類似のものの使用が必要になります。)hashselectin

また、パスワードハッシュにMD5を使用しないでください。総当たり攻撃は簡単すぎます。SHAxも使用しないでください。この目的のために設計されていないため、まだ速すぎます。bcryptまたはのようなものを使用しますscrypt。「サーバーソルト」(これは優れた追加レイヤーです)が必要な場合は、HMACを使用してください。これは通常の塩に置き換わるものではありません。ああ、SQLインジェクションが発生しやすいコードは使用しないでください

私は既存のよく吟味されたライブラリを使用します:)

ハッピーコーディング。

于 2012-04-14T07:23:25.300 に答える