DBに対するユーザーのパスワードを確認しました。より速く/より使いやすいもの:MySQLまたはPHPのmd5関数?
何のMySQL MD5機能、高速である
... pwd = MD5('.$pwd.')
OR PHP MD5機能
... pwd = '.md5($pwd).'
2つのオプションの正しい方法は何ですか?
DBに対するユーザーのパスワードを確認しました。より速く/より使いやすいもの:MySQLまたはPHPのmd5関数?
何のMySQL MD5機能、高速である
... pwd = MD5('.$pwd.')
OR PHP MD5機能
... pwd = '.md5($pwd).'
2つのオプションの正しい方法は何ですか?
あなたのアプリケーションがあなたのサイトに登録したり、ログインしているときにアプリケーションが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";
あなたはおそらくこのような百万md5を計算しませんでしょうか?
(そして、これはSQLインジェクションを防ぐこととは何の関係もありません:ちょうど脱出を/引用、あなたのデータは常にまたはプリペアドステートメントを使用します!!)
どちらが速いのかわかりませんが、PHPで実行すると、SQLインジェクションの可能性は避けられます。
いずれにしても、$ pwd paramsにmysql_real_escape_stringを作成します。 –
これはそれとは関係ありません。準備されたステートメントは、MD5関数を動かさずにこれを修正します。また、PHP MD5関数を使用してパスワードを "エスケープ"します。 – Draemon
@Draemon:他の方法はないとは言いませんでしたが、この例ではパラメータをエスケープする兆候はありません。 @ hiam:あなたがphpでそれをすることにした場合、パスワード文字列を最初にエスケープするべきではありません。 phpのmd5関数は任意の文字列を取ることができ、^ [0-9a-f] {32} $ – Kip
これを測定してください。それは確かな唯一の方法です。
ここでパフォーマンスが本当に問題になりますか?それは限界があると思われる。 MySQLの中でそれをやって
を返すことが保証されています。何とかそれを悪用しようとしていますが、32桁の16進数の代わりにいくつかの特殊文字と整形式のSQL文が出力されますか?起こらないだろう。 – lacop
これはまさに悪用につながる態度です。あなたは任意の機能を使用してはいけませんし、あなたのデータを消毒することを願っています。誰かがある時点でMD5要件を削除した場合 - データが安全でないことを認識しているか? – Draemon
これは単なる愚かなことです。エスケープする機能を信頼することはできませんし、まったく極端な機能にすることもできません。 PHP自体やmysqlでもバグが発生する可能性があります。だから、悪用を避ける唯一の方法は、コードを書かないことです。 – lacop
、そして比較あなたのクライアントコード(例えばphp)に計算されたハッシュの結果。
これを行う主な理由は、データベースが非バイナリ形式(例:大文字小文字を区別しない)で列を照合するなどの愚かなことを避けることです。
それ以外は失敗したら、実験を行います。 – Rafe
だから、phpで行うのではなく、約1マイクロ秒をデータベースに保存します。かなり無視できるように聞こえるが、それでもなお興味深いのは – Kip
+1は非常に徹底的な答えとSQLインジェクションについての重要な点です:) – Draemon