は、私が使うべきではif(strcmp(md5($string),$hash)==0)
またはif(md5($string)==$hash)
ハッシュされた文字列を比較する最良の方法は何ですか? (PHP)
答えて
==
は、非常に信頼性がないと、ここで他のユーザーによって示されています。代わりにstrcmp()
を使用してください。あなたが本当に比較演算子を使用したい場合は
第三の選択肢は、あらゆる種類の型変換を実行しません===
を使用することですので、種類と比較の目的のために値を保持します。
どちらが優れたパフォーマンスを備えていますか? – webnat0
==、以下の投稿のように1つのcomparsionしかないので、 –
@ Da9:...と関数呼び出しはありません。 –
私はif(md5($string) == $hash)
が2(stcmp & ==)の代わりに1つの比較しかないので、より良いと思います。
md5は、バイナリセーフコンパイルを必要としないascii-charsのみを生成します。
@MM答えを見てください。 2番目のすべてのmd5は廃止されました(ハッキングされる可能性があることが証明されています)。 shaを使用してください。 – Symba
もちろん、あなたはmd5上でshaを使うべきです。しかし、質問者は、彼がどちらを使うべきか尋ねました。誰かがあなたに「あなたはイチゴのアイスクリームかチョコレートのアイスクリームが好きですか?」と尋ねると、「私はバニラアイスクリームをとる」と答えることはできません。さらに、問題はハッシュアルゴリズムを使用することではなく、値を比較することです。 –
ここではアイスクリームについては言及しませんが、セキュリティについては言及しません。だから答えは確かに "あなたがここに提案したものは何も使わないでください!"です。 そして、BTW:SHA-1 **をパスワードとして使用してはいけません。 – rugk
文字列を比較する場合は、strcmp
または===
を使用してください。人々は===
を好むので、strcmp
は混乱する可能性があります(成功した場合は0
を返します)。
===
ではなく、==
を使用する必要があります。 ==
は、両方のオペランドをそのように解釈できる場合には整数に変換し、MD5ハッシュは整数に収まらないため、半分の周りで切り捨てられます。したがって、ハッシュの最初の半分だけが等しくなければなりません。 http://phpsadness.com/sad/47を参照してください。
パスワードをハッシュする場合は、MD5ではなくPBKDF2などの低速で強力なハッシュアルゴリズムを使用することを検討してください。
うわー...本当に本当に悲しいです。 – BoltClock
タイミング攻撃にウィンドウを開く可能性があるので、認証などのハッシュを直接比較するときは、非常に注意が必要です。
非常に直感的ではありませんが、文字列を完全に比較して最適化を避ける必要があります(つまり、文字が異なる場合は早めに終了する必要があります)。ここで
は、問題に関するいくつかのリンクです:
- https://wiki.php.net/rfc/timing_attack
- http://codahale.com/a-lesson-in-timing-attacks/
- http://carlos.bueno.org/2011/10/timing.html
そして、ここではそれを修正するためにいくつかのアイデアです:
- 最も速くて簡単な方法は
hash_equals()
(利用可能であれば)(PHP 5.6以上)です。 - https://github.com/symfony/polyfill-php56/blob/master/Php56.php(
hash_equals()
ポリフィル) - https://github.com/zendframework/zend-crypt/blob/master/src/Utils.php(
compareStrings()
)
あなたがPHP 5.6より新しいものを使用して(を含む)している場合は、timing attack safe string comparison機能を使用する必要があります。
if (hash_equals($expected, $correct)) {
}
(あなたがPHP 5.5またはそれ以前、see here for equivalentsにしている場合。)
本当に唯一正しい答えです。 –
実際にあなたがこのためにpassword_verify
を使用すると、他のすべてのpassword_*
の機能を使用する必要があります。 PHP> = 5.5.0で利用可能です。
フォールバックとしてthis polyfillを使用できます。現在、PHP> = 5.3.7で動作します。
本当にこれを使用できない場合は、まだhash_equals
(およびそのポリフィルは@MM)です。すでに言った。
- 1. ハッシュされた文字列を比較する
- 2. sha1ハッシュを等価で比較する最良の方法
- 3. 日付ではない日付と文字列を比較する最も良い方法は何ですか?
- 4. PHPでutf8でエンコードされた文字列を比較する
- 5. VBAの文字列を比較する最も良い方法は?
- 6. 文字列をPHPでUnicode文字の配列に分割する最も良い方法は何ですか?
- 7. PHPの文字列比較
- 8. PHPの文字列比較
- 9. 2つのエンティティフレームワークエンティティを比較する最良の方法は何ですか?
- 10. PHPで区切られた文字列データを分割する最も良い方法は何ですか
- 11. Crystal Reportsを比較する最良の方法は何ですか?
- 12. PHPの日付と文字列を比較する方法
- 13. 文字列を比較/設定する最速の方法
- 14. リモートサーバー間でファイルを比較する最も良い方法は何ですか?
- 15. 文字列または文字配列のインデックスを取得する最も良い方法は何ですか?
- 16. URL文字列を比較すると隠された文字
- 17. 文字列内の特定の単語とC++のif文またはwhile文を比較する最良の方法は何ですか?
- 18. 文字列とPHPの文字列を比較しますか?
- 19. PHPで文字列を連結する最良の方法
- 20. PHPで文字列を圧縮する最良の方法
- 21. 入力された文字列と格納された文字列を比較する方法-MIPS
- 22. 文字列と部分文字列を比較する方法
- 23. Sequel Gemで文字列の配列とフィールドを比較する最も良い方法は?
- 24. ローカライズされた文字列とデータベースの文字列を比較するには?
- 25. 2つの類似した文字列を比較する最良の方法は?
- 26. AppleScriptでローカライズされた文字列をフォーマットする最も良い方法は何ですか?
- 27. 文字列配列の部分文字列を取得する最良の方法は何ですか?
- 28. バージョン#を文字列内で比較する方法は?
- 29. インデックスや文字列のインデックスやハッシュを比較する
- 30. $ _POSTで得られた文字列とphpのfile.txtから得られた文字列を比較する
カスタムソート関数で 'strcmp'を使用します。 「通常の」使用の場合、文字列を直接比較する方が簡単で読みやすくなります。 –
このスレッドを読んでいる人は、[それはしないでください** ** at all at **](http://phpsadness.com/sad/47)。 – ereOn
単にハッシュを確実に比較したいのであれば、 '==='を使うだけです。セキュリティと潜在的なタイミング攻撃(ネットワークジッタにもかかわらず)に本当に関心があるなら、[this](https://github.com/delight-im/Faceless/issues/4)または[this] (https://github.com/delight-im/Faceless/pull/5)議論をするか、 'hash_equals()'関数(PHP 5.6+)を使用してください。 – caw