13

ユーザーのパスワードをDBと照合しました。

より速いのは、MySQL MD5 関数

... pwd = MD5('.$pwd.')

またはPHP MD5 関数

... pwd = '.md5($pwd).'

2 つのオプションの間の正しい方法は何ですか?

4

5 に答える 5

26

誰かがあなたのサイトに登録したとき、またはログインしているときにアプリケーションが md5 のみを計算している場合、md5 への多くの呼び出しを 1 時間ごとに行いますか? 数百?もしそうなら、PHP と MySQL のほんのわずかな違いはまったく重要ではないと思います。

質問は、「ほとんど何も勝てない理由」よりも、「パスワードが md5 を使用して保存されているという事実をどこに置くべきか」のようなものにする必要があります。

また、補足として、別の質問として、その種の計算にリソースをどこに費やす余裕があるかということも考えられます。10 台の PHP サーバーと 1 台の DB サーバーがすでに大きな負荷にさらされている場合、答えが得られます ;-)

しかし、ただの楽しみのために:

mysql> select benchmark(1000000, md5('test'));
+---------------------------------+
| benchmark(1000000, md5('test')) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (2.24 sec)

そしてPHPで:

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    $a = md5('test');
}
$after = microtime(true);
echo ($after-$before) . "\n";

与える:

$ php ~/developpement/tests/temp/temp.php
3.3341760635376

しかし、おそらくこのように 100 万個の md5 を計算することはないでしょう?

(そして、これは SQL インジェクションの防止とは何の関係もありません。データをエスケープ/クォートするだけです! 常に ! または準備済みステートメントを使用してください)

于 2009-07-26T13:23:29.337 に答える
5

どちらが速いかはわかりませんが、PHP で実行すると、SQL インジェクションの可能性を回避できます。

于 2009-07-26T13:13:21.597 に答える
3

ここで本当にパフォーマンスが問題になるのでしょうか? 限界である可能性が高いです。

  • MySQL でそれを行うと、DB がより多くの作業を行うようになります。これは良いことです。
  • MySQL でこれを行うと、クリアテキストのパスワードがさらに渡されます (DB 接続は多くの場合、暗号化されていません)。
  • これは SQL インジェクションとは関係ありません。MD5 関数を移動せずに最初のバージョンを修正できます。また、PHP の MD5 関数にバグがあった場合でも、インジェクション攻撃の可能性があります。
于 2009-07-26T13:21:17.357 に答える
0

測定してください。それが確実な唯一の方法です。

于 2009-07-26T13:19:24.427 に答える
0

mysql から列の値を読み取り、その結果をクライアント コード (php など) で計算されたハッシュと比較します。

これを行う主な理由は、データベースが非バイナリ形式 (大文字と小文字を区別しないなど) で列を照合するなどの愚かなことを回避するためです。これは一般的にハッシュには望ましくありません。

于 2009-07-26T21:45:55.920 に答える