2013-02-07 12 views
6

私はPHPで構築された新しいウェブサイトの開発者です。私は、正確には ハッシュに使用するものが何か不思議です。私はmd5とsha1を見てきましたが、より安全なものがあります。
これは問題ではないが、私はPHP Securityを初めて使っていて、 サイトを可能な限り安全にしようとしています。また、塩は何ですか?
おかげで、
WaseemPHP - MD5、SHA、ハッシングのセキュリティ

+1

ハッシュのために何を使用しますか?塩に関してはhttp://en.wikipedia.org/wiki/Salt_(cryptography) –

+0

パスワードとユーザ名を参照してください。 –

+0

ヒント: 'bcrypt' - それがすべてです。 – Leigh

答えて

9

まず第一には、MD5とSHA1は、衝突攻撃にvunrableであることが証明されていると(彼らはあなたがハッシュならば、共通のパスワードを自分のデータベースに同じである見ると)簡単に上程 虹ことができます。
現在のところ、パスワードで保護され、使用できるものは2つあります。
最初のものはsha512です。 sha512はSHA2のサブバージョンです。 SHA2はまだ衝突攻撃の可能性があると判明していない であり、sha512は512ビットのハッシュを生成します。ここでSHA512を使用する方法 の例です。

<?php 
hash('sha512',$password); 

他のオプションが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番目の質問に答えるために。塩は通常、あなたがハッシュしたときにパスワード の末尾に追加するランダムな文字列です。塩を使用すると、データベースを取得する人がいる場合は、 は、共通パスワードのハッシュをチェックできません。データベースのチェックは、虹のテーブルを使用して呼び出されます。ハッシュの時はいつも塩を使うべきです!!
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.htmlhttp://eprint.iacr.org/2010/413.pdfhttp://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdfhttp://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfUnderstanding sha-1 collision weakness

+4

ちょうど記録のために:bcryptは、高速ではなく非常に遅いことで有名です(http://codahale.com/how-to-safely-store-a-password/)。 – ckruse

+0

偉大な答え! – Mez

+0

@ckruse間違えて申し訳ありませんが、私はそれを修正します:) – C1D

1

塩の全体の目的は、前のリストを比較するから、攻撃者を遅くすることである。ここでは

はSHA1とMD5衝突攻撃の脆弱性のための私の証明されています生成されたハッシュに対して生成されたハッシュ

平文パスワードごとに1つの "ハッシュ値"を事前計算する必要はなく、平文パスワード(2^7 * 2^7)ごとに16384の "ハッシュ値"を事前に計算する必要があります。

今日では、暗号機能が初めて開発されたときにはかなり大きかったです。計算には、多くのパスワードを計算するために、予想される平文パスワード(辞書)の数がかなり多くなりました。

私たちはシャドーパスワードのようなものを持っているので、crypt以外の他のコアパスワード機能と、辞書に表示されないパスワードを選択したいすべてのsysadがあります。

生成したいハッシュがパスワード用のものである場合、これはそれを実装するための十分に容認された方法です。あなたがパスワードのためにこれを行うことを計画している場合は

http://www.openwall.com/phpass/

+0

情報ありがとう! –

+0

ナンバー16384はどうやって得られたのか分かりません。各パスワードを異なる塩と組み合わせると、攻撃者は1つのパスワードごとにレインボーテーブルを作成しなければならず、1つのレインボーテーブルを使用してすべてのパスワードを取得することはできません。それは塩の目的であり、秘密ではなく、辞書攻撃には役立ちません。 – martinstoeckli

+0

@martinstoeckli - 私はDaniloが塩として2つの7ビットASCII文字を仮定していたと考えているため、16,384の可能性があります。そして、私は皆さんが "お互いに過去を話している"と思っています。つまり、あなたはどちらも同じことを言っていると思います。 "n"パスワード用の虹のテーブルの代わりに、 "n"個のパスワード(または概念的には、 "n"要素配列の代わりに16K x "n"マトリックス)のそれぞれに16Kのエントリがあります。 – Dan

0

、その後、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があなたのために塩を処理するので、この詳細についてはあまり心配する必要はありません。

希望に役立ちます。

関連する問題