私は PHP で構築された新しい Web サイトの開発者であり、ハッシュに使用するのに何が最適かを考えています。私は md5 と sha1 を見てきましたが、もっと安全なものはありますか?
これが初心者の質問である場合は申し訳ありませんが、私は PHP セキュリティに不慣れで、サイトをできるだけ安全にしようとしています。また、塩とは何ですか?
ありがとう、
ワシーム
3 に答える
まず、md5 と sha1 は衝突攻撃を受けやすいことが証明されており、簡単にレインボー テーブルに登録できます (共通パスワードのデータベースでハッシュが同じかどうかを確認した場合)。
現在、パスワードに対して十分に安全で、使用できるものが 2 つあります。
最初は sha512 です。sha512 は SHA2 のサブバージョンです。SHA2 が衝突攻撃に弱いことはまだ証明されておらず、sha512 は 512 ビットのハッシュを生成します。sha512 の使用方法の例を次に示します。
<?php
hash('sha512',$password);
もう 1 つのオプションは bcrypt と呼ばれます。bcrypt は安全なハッシュで有名です。それはおそらく最も安全で、最もカスタマイズ可能なものでもあります.
bcrypt の使用を開始する前に、サーバーで bcrypt が有効になっているかどうかを確認する必要があります。次のコードを入力してください。
<?php
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
echo "CRYPT_BLOWFISH is enabled!";
}else {
echo "CRYPT_BLOWFISH is not available";
}
有効になっていることが返された場合、次のステップは簡単です。パスワードを bcrypt するために必要なことは次のとおりです (より多くのカスタマイズを可能にするためには、これを確認する必要がありますHow do you use bcrypt for hashing passwords in PHP? ):
crypt($password, $salt);
次に、2 番目の質問に答えます。ソルトは通常、パスワードをハッシュするときにすべてのパスワードの最後に追加するランダムな文字列です。ソルトを使用すると、誰かがデータベースを取得した場合、一般的なパスワードのハッシュをチェックできなくなります。データベースのチェックは、レインボー テーブルを使用して呼び出されます。ハッシュするときは、常にソルトを使用する必要があります!!
SHA1 および MD5 衝突攻撃の脆弱性に関する私の証拠は次のとおりです:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html、http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf、http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfおよびsha-1 衝突の弱点について
ソルトの全体的な目的は、攻撃者が事前に生成されたハッシュのリストをターゲット ハッシュと比較するのを遅らせることです。
平文パスワードごとに 1 つの「ハッシュ」値を事前計算する必要がある代わりに、攻撃者は平文パスワードごとに 16384 個の「ハッシュ」値 (2^7 * 2^7) を事前計算する必要があります。
それは今日では見劣りしますが、暗号化機能が最初に開発されたときはかなり大きかったです。多くのパスワードに、あなたが疑う平文のパスワード (辞書) の数を掛けたものを事前計算する計算能力はかなり高かったのです。
今日はそれほど多くないため、シャドウ パスワード、crypt 以外のその他のコア パスワード機能、および辞書に表示されないパスワードを選択するように求めるすべてのシステム管理者などがあります。
生成したいハッシュがパスワード用である場合、これはよく受け入れられている実装方法です。
パスワードにこれを行う予定がある場合は、MD5 または SHA1 を使用しないでください。彼らは、塩でさえ、弱くて安全ではないことが知られています.
それらを他の目的で使用している場合(たとえば、ファイルのハッシュを提供してその信頼性を確認したり、ランダムハッシュデータベース列を提供して疑似ランダムソート順序を提供したりする場合)、それらは問題ありません(ある程度まで)が、そうではありませんパスワードなど、安全に保管する必要があると思われるもの。
パスワード ハッシングの現在のベスト プラクティス アルゴリズムは、適切なソルティングを使用した BCrypt です。
また、PHP で BCrypt パスワード ハッシュを実装する最善の方法は、PHP の新しいパスワード API を使用することです。この API は、数か月以内にリリースされる予定の次のバージョンの PHP v5.5 で一連の組み込み関数として機能します。幸いなことに、現在のバージョンの PHP (5.3 および 5.4) のユーザー向けに後方互換バージョンもリリースされているため、PHP 5.5 はまだリリースされていませんが、新しい API をすぐに使い始めることができます。
互換性ライブラリは、https ://github.com/ircmaxell/password_compat からダウンロードできます。
また、あなたは「塩」とは何かと尋ねました。この回答で何度か言及したので、質問のその部分にも対処する必要があります。
ソルトは基本的に、解読を困難にするために、パスワードをハッシュするときにパスワードに追加される追加の文字列です。
たとえば、攻撃者は、特定のパスワード文字列、または特定のパスワード文字列全体のハッシュ値を事前に知っている可能性があります。彼があなたのハッシュ化されたデータを手に入れることができ、あなたがソルトを使用していない場合、彼はあなたのハッシュを彼の既知のパスワードのリストと比較することができます。使用されたハッシュ方法に関係なく、数秒でクラックされます。
ただし、パスワードをハッシュするときにパスワードに秘密の余分な文字列を追加した場合、ハッシュされた値は元のパスワードの標準ハッシュと一致しないため、攻撃者が値を見つけるのが難しくなります.
幸いなことに、上記の API を使用している場合は、API がソルティングを処理するため、詳細についてあまり心配する必要はありません。
それが役立つことを願っています。