0

ユーザーがログインしようとしたときに、ユーザーが有効かどうかを確認する方法は 2 つあります。

方法 1: 次のクエリを実行し、返された行数が 1 であることを確認します。

SELECT * FROM users WHERE username = $_POST['username'] AND password = md5($_POST['password'])

方法 2: クエリを実行し、パスワードが一致することを確認します。

SELECT * FROM users WHERE username = $_POST['username']

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)){
   if($row['password'] == md5($_POST['password'])) $logged_in = TRUE;
}

これらの方法のいずれかが他の方法よりも優先されますか? もしそうなら、なぜですか?

4

3 に答える 3

4

キー、ソルト、およびパスワードを使用します。md5安全ではありません。

サーバーでは、キーを保存します。

$key = 'fPu6AY;h0-5Q>cIel,@n2$gickGs9{ys~+DT,v|Mz-]~EU3tuj18|~Ch#1_$)fGR';

ユーザーが登録されると、一意のソルトが生成され、暗号化されたパスワードとともにサーバーに保存されます。

| | ソルト | パスワード |
-------------------------------------------------- -------------------------------
| | jAcTgi ~ 4 (Z | 877236d15a7b7a1f36febc49e58b142d70d72cf7d6e54dcfb252d7cde6b62a2d |

パスワードは次のように暗号化されます。

$hash = hash('sha256', $keyFromServer . $saltFromDb . $userPassword);

次に、メソッド 2 を使用してソルトとハッシュを取得し、それをデータベースのパスワードと比較する必要があります。

于 2013-03-19T20:39:06.240 に答える
2

PHPassなどのライブラリを使用できるため、方法2をお勧めします。また、ユーザーがどちらかを間違って入力したかどうかを推測するのではなく、無効なユーザー名を入力したことをユーザーに通知する機能も提供します。Aarolamaは、md5が安全でないことについて正しいです。残念ながら、どちらもSHAシリーズではありません。これらは両方ともファイルハッシュであり、ファイルに一意のラベルを付けて識別するために使用されます。暗号化ハッシュを使用して、blowfishのようなパスワードを保護します。PHPassは多くのセキュリティを処理します。ソルトはランダムに生成され、ユーザーごとに一意である必要があります。ソルトを自分で使用するための唯一の方法は、2番目の方法を使用することです。

于 2013-03-19T20:59:49.110 に答える
0

FreshPrinceOfSOの回答に追加するには、秘密鍵を塩漬けのプレーンテキストと単純に連結しないでください。代わりに HMAC アプローチを使用してください。

$hash = hash_hmac('sha256', $saltFromDb . $userPassword, $keyFromServer);

HMAC の詳細については、ウィキペディアRFC 2104を参照してください。また、単純なアプローチに欠陥がある理由についても説明されています。また、HMAC は、基礎となるハッシュ アルゴリズムのみよりも衝突による影響が大幅に少ないことにも注意してください。つまり、同じコア アルゴリズムと出力サイズにもかかわらず、HMAC はより安全です。

ところで、出力サイズについて。前述の RFC 2104 のセクション 5 では、切り捨てられたハッシュ (元のサイズの半分以上) は可能な値の総数を減らすと同時に、力ずくで平文を回復することをより困難にすることが述べられています。チェックする完全なハッシュ値が攻撃者に利用できなくなります。これは非 HMAC ハッシュにも適用されます。

于 2013-04-05T17:15:52.037 に答える