SHA1 vs md5 vs SHA256:PHPログインに使用するものは?


133

私はphpログインを作成しています。別のstackoverflow記事で説明したSHA1またはMd5、またはSHA256を使用するかどうかを決定しようとしています。それらのどれかが他のものより安全ですか?SHA1 / 256の場合、引き続きソルトを使用しますか?

また、これはパスワードをハッシュとしてmysqlに保存する安全な方法ですか?

function createSalt()
{
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();

$hash = sha1($salt . $hash);


この回答も参照し、パスワードのハッシュに関するセクションを読んでください。
ジャック

回答:


110

どちらでもない。使用する必要がありますbcrypt。あなたが言及するハッシュはすべて、ハードウェアで迅速かつ簡単になるように最適化されているため、それらをクラックすることは同じ品質を共有します。他に選択肢がない場合は、少なくとも長いソルトを使用し、複数回ハッシュし直してください。

PHP 5.5以降でのbcryptの使用

PHP 5.5は、パスワードハッシュのための新機能を提供します。これは、最新のWebアプリケーションでのパスワードストレージの推奨アプローチです。

// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// If you omit the ['cost' => 12] part, it will default to 10

// Verifying the password against the stored hash  
if (password_verify($password, $hash)) {
    // Success! Log the user in here.
}

古いバージョンのPHP 使用している場合は、本当にアップグレードする必要がありますが、使用するまでは、password_compatを使用してこのAPIを公開できます。

また、password_hash()塩を生成させてください。CSPRNGを使用します。

bcryptの2つの警告

  1. Bcryptは、72文字を超えるパスワードを警告なしに切り捨てます。
  2. BcryptはNUL文字の後に切り捨てます。

(ここにある両方の警告の概念実証)。

bcryptを実行する前にパスワードを事前にハッシュして最初の警告を解決したくなるかもしれませんが、そうするとアプリケーションが2番目に実行される可能性があります。

独自のスキームを作成する代わりに、セキュリティの専門家によって作成または評価された既存のライブラリを使用してください。

TL; DR - bcryptを使用します。


1
また、私はこれで非常に新しいです:sha1、sha256、およびmd5はすべてあなたが参照する「ハッシュ」ですか?
トニースターク

3
はい。ここでは、SHA1、SHA256、MD5、および速度が最適化されたその他の一連のハッシュについて言及しています。パスワードを保護するために速度を最適化したハッシュを使用したくない場合。特にこの1のような存在理由を議論する多くの良い記事があり、I: chargen.matasano.com/chargen/2007/9/7/...
ヨハネスGorset

4
PHP 5.3以降、「crypt」関数に含まれています。以前のバージョンをお持ちの場合は、「phpass」フレームワークで次善の策を検討します。
ヨハネスゴーセット

3
@Stanislav Palatnik SHA512は良い代替品です。誤解しないでください。伸ばしてソルトしたSHA512ハッシュが安全でないと言っているのではありません。安全です。それでも、bcryptの方が安全であるという事実が残っているため、使用しない理由はないと思います。
Johannes Gorset、2010

10
@Cypher:bcryptクラッキングが同様に遅くなるように遅くなるように設計されています。
Johannes Gorset 2013年

23

md5、sha256、または速度を最適化したハッシュを使用することは完全に問題なく、他のユーザーの反論を聞いて非常に興味があると思います。ここに私の理由があります

  1. ユーザーが、その後何も、あなたはまだユーザーはハッシュとこれらのパスワードは、多くの場合、最初に使用されていないパスワードを入力することができます暗号化をかまいので、これはされて、このような神、愛、戦争、平和などの弱いパスワードを使用しないでできるようにする場合は、NOT行きます暗号化とは何か関係があります。

  2. SSLを使用していない場合や証明書がない場合は、トラフィックをリッスンする攻撃者がパスワードを引き出すことができ、JavaScriptなどで暗号化しようとすると、クライアント側で簡単に解読され、克服されます。繰り返しますが、これはサーバー側のデータ暗号化とは関係ありません

  3. ブルートフォース攻撃は弱いパスワードを利用します。ログイン制限が3または少しでもない場合、ユーザーがデータを入力できるようになるため、問題はデータの暗号化とは何の関係もありません

  4. データベースが危険にさらされた場合、可能性の高い暗号化方法に関係なく、ハッシュ技術を含むすべてのものが危険にさらされています。繰り返しになりますが、これは不満を持つ従業員のXSS攻撃、SQLインジェクション、またはパスワードの暗号化とは関係のない他の攻撃である可能性があります。

私はあなたがまだ暗号化すべきだと信じていますが、暗号化ができることは、すでにまたは何らかの方法でデータベースへのアクセス権を持っている人がパスワードを読み上げるのを防ぐことだけです。暗号化されたパスワードがクレジットカード番号を含むすべてを保護していると彼らが思っているので、ソニーがそれをした理由は、データベースで許可されていない誰かである場合、それを心配する大きな問題があります。

データベース内のパスワードの複雑な暗号化に対して私が見ることができる唯一の純粋な利点は、データベースにアクセスできる従業員または他の人々がパスワードを読み取るだけから遅らせることです。したがって、それが小規模なプロジェクトである場合、サーバー側のセキュリティについてそれほど心配する必要はありませんが、代わりに、SQLインジェクション、XSS攻撃、その他の大量の方法など、クライアントがサーバーに送信する可能性のあるすべてのセキュリティを確保することについて心配します。侵害される可能性があります。誰かが同意しない場合は、クライアント側からのスーパー暗号化パスワードが必須である方法を読むのを楽しみにしています。

私がこれを試みて明確にしたかった理由は、暗号化されたパスワードが侵害されることを心配する必要がなく、Webサイトのセキュリティを心配する必要がなくなることを信じる人が多すぎるためです。


1
よく述べた。サイバーセキュリティは、ハッシュ手法よりも優先されます。それらは、データを保存するだけでなく、サーバー防御の準備も維持します。
CᴴᴀZ

14
これは本当に誤解されています。もちろん、データベース内のパスワードを安全にハッシュしても、アプリケーションレベルまたはデータベースレベルのセキュリティは向上しません。セキュリティのすべてを網羅しているわけではありません。2つの理由で、データベース内のユーザーパスワードを安全にハッシュしたい場合。最初に、顧客は他のサイトで使用する場合も使用しない場合もあるパスワードであなたを信頼しているため、dbが危険にさらされている場合でもこれが回復可能でないことを確認する必要があります。次に、セキュリティの場合に責任を取り除きます。違反。訴訟がすぐに起こったということは知りませんが、パスワードが漏洩すると、会社の見栄えが悪くなります。
James McMahon

6
これは悪いアドバイスです。誰かがデータベースを盗み、ハッシュされたすべてのパスワードを入手した場合、たとえデータベースの他の部分も侵害されたとしても、パスワードのクラックとログオンを防ぐことが重要です。(たとえば、銀行のWebサイトを考えてみてください。)速度が最適化されたアルゴリズムにより、攻撃者は、一致するものが見つかるまで、盗んだハッシュに対して多くの候補をテストできます。bcryptやscryptのようなアルゴリズムは、たとえ使用するアルゴリズムを知っていても、ハッシュに対して候補をテストするのは遅くて費用がかかります。したがって、誰かがハッシュを盗んだ場合、より良い保護を提供します。
リチャード

6
「データベースが危険にさらされた場合、どれほど暗号化されていても、ハッシュ技術を含むすべてが危険にさらされている可能性があります。」そのため、 bcryptは非常に重要です。bcryptでは、誰かがハッシュを持っているかどうかは重要ではありません。SHA1 / MD5のような高速ハッシュアルゴリズムを使用すると、それが可能になります。
ceejayoz 2015

他のすべてのデータが平文である場合、パスワードが1000%安全であるかどうかは問題ではないというのが一部の見落としのポイントだと思います。たとえば、データベース全体が侵害された場合、ハッカーはすべての平文のクレジットカード番号を入手します。はい、多くの人が異なるWebサイトで同じパスワードを使用していますが、それらを使用しないように悪心を告げられているので、もはや問題ではありません。データベース自体に機密情報が含まれており、その侵害が懸念される場合は、データベース全体を必要なだけ強く暗号化します。
UncaAlby 2016

15

Johannes Gorsetが指摘したように、Matasano SecurityのThomas Ptacekによる投稿、MD5、SHA1、SHA256、SHA512などの単純な汎用ハッシュ関数がパスワードハッシュの選択肢として不適切である理由が説明されています

どうして?最近のコンピューターでは、コアごとに少なくとも1,000,000 MD5ハッシュを計算できるため、速度が速すぎます。そのため、ユーザーが使用するほとんどのパスワードに対してブルートフォースが実行可能です。そして、それはGPUベースのクラッキングサーバークラスターよりもはるかに少ないです!

キーストレッチなしのソルティングは、レインボーテーブルを事前に計算できないことを意味します。特定のソルトに合わせてアドホックで構築する必要があります。しかし、それは実際にはそれほど難しくありません。

ユーザー@Willさんのコメント:

誰もがインターネットを介してハッキングされる可能性があるように、これについて話しています。すでに述べたように、試行を制限すると、インターネットを介してパスワードを解読することが不可能になり、ハッシュとは何の関係もありません。

彼らはする必要はありません。明らかに、LinkedInの場合、彼らは一般的なSQLインジェクションの脆弱性を使用してログインDBテーブルを取得し、数百万のパスワードをオフラインでクラックしました。

次に、オフラインの攻撃シナリオに戻ります。

データベース全体が危険にさらされ、ハッカーがmd5ハッシュに対して毎秒1億回のパスワード試行を実行できる場合、セキュリティが実際に機能します。SHA512は約10,000倍遅くなります。

いいえ、SHA512はMD5よりも10000倍遅いわけではなく、約2倍しかかかりません。一方、Crypt / SHA512は非常に異なる獣であり、対応するBCryptと同様に、キーストレッチを実行し、組み込みのランダムソルトで非常に異なるハッシュを生成し、計算に500〜999999倍の時間を要します。 (ストレッチは調整可能です)。

SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

したがって、PHPの選択は、Crypt / Blowfish(BCrypt)、Crypt / SHA256、またはCrypt / SHA512のいずれかです。または、少なくともCrypt / MD5(PHK)。www.php.net/manual/en/function.crypt.phpを参照してください


単純なパスワードハッシュは問題ありません。サーバーを安全に保つのはファイアウォール次第です。「ファイアウォール」とは、ブルートフォースをブロック/スローダウンする反応型ファイアウォールを意味します(人間は高速にしか入力できません)..これコンテストは無意味です.. ..「ハッカーが侵入し、今ではすべてを持っているとしたら」(face-desk)-ハッカーがサーバーに侵入した場合-終わりです。パスワードが解読されるのは、ほとんどが単純すぎるためです。または、ソフトウェア開発者が怠惰すぎてサイバー犯罪者のように考えることができないためです。

@argonもう一度お読みください。パスワードをハッシュの全体の目的はそうあることであるとき、あなたはすぐに最も頻繁にシンプル異なる-そうでないサイト間でのユーザーによって再利用されているユーザーのパスワードのすべてをリークしていないログインDBが危険にさらされている(と、それはいくつかの点であろう)入力後の遅延。そして、「彼らがあなたのサーバーに入った場合、ゲームオーバー」は、彼らがあなたのサーバーのに入る必要がないので、議論の余地があります。ハッカーが使用する最も一般的な脆弱性はSQLインジェクション(Linkedinのケースを参照)であり、ハッシュをブルートフォースします。だから塩漬けとストレッチが必要です。
LexLythius

セキュリティ要件が非常に厳しい場合は、パスワードを別の場所に保存することをお勧めします。データ(およびソースコード)を保護する方法はたくさんあります-"if / when"の場合... ..-"gazillion bits"までのパスワードのハッシュは、パスワード作成者/ゲストシステムと同じくらい安全です。 、データ転送、およびサーバーハードウェアにサービスを提供する人間。..言われていること:私はハッシュが役に立たないと言っているわけではありませんが、あなたの解決策がもっと複​​雑なハッシュであるなら、量子コンピュータに関して、近い将来にはうまくいかないと思います。

再帰的ハッシュは、ハッキングの試みに作業/コストを追加します。反復が多いほど、クラックが難しくなるため、SHA256のような高速ハッシュを使用することもできます。反復はランダムである必要があり、公開することができます。password_hash()ハッシュ自体のコストを示します。
ビクターストッダード

@VictorStoddardはい、独自のハッシュスキームをロールして、調整可能なキーストレッチを提供できます。しかし、専門家が作成し、まさにこの目的のために利用可能にした既存のはるかに精査されたアルゴリズムを使用する代わりに、なぜそれをしたいのですか?
LexLythius

13

を使用しSHA256ます。SHA512高速ハッシュに理想的であるように、それは完璧ではありませんが、オプションの中で、それは確実な選択です。ハッシュ技術と同様に、セキュリティを高めるためにハッシュをソルトするようにしてください。

追加のメモとして、FRKT、誰かがソルトされたSHA256ハッシュを簡単にクラックできる場所を教えてください。これを見て本当に興味があります。

重要な編集:

今後bcryptは、強化ハッシュとして使用してください。詳細については、こちらをご覧ください


塩漬けに関する編集:

乱数、またはランダムバイトストリームなどを使用します。データベース内のレコードの一意のフィールドをソルトとして使用することもできます。これにより、ソルトはユーザーごとに異なります。


1
しかし、速度を重視して最適化されているため、ブルートフォースハッキングが可能です。
arbales

6
事実は残っていますが、これはパスワードを保護するためです。ソルトでハッシュを使用し、Webサイトに3回の試行制限を追加すると、ハッカーの試行(ブルートフォーサーでさえ)が大幅に遅くなります。純粋な暗号化を使用すると、鍵の保護という別の問題が発生します。キーが見つかると、データベース全体が危険にさらされます(ソルトが追加されていない場合)。ただし、ハッシュはシステムから元のパスワードを取得することはありません。
Kyle Rosendo、2010

1
前述のように、MDおよびSHAシリーズの問題は、速度が最適化されていることです。コンピューティングが進化するにつれて、この性質のハッシュがますます安全でなくなることは避けられません。
ヨハネスゴーセット

1
コンピューティングが進化するにつれ、何かがますます悪く/安全でない/などになります。SHA512などがハッキングされるまでに、より安全なアルゴリズムが利用できるようになります。これは、いずれにせよコンピューティングの性質です。
Kyle Rosendo、

1
PHPで塩を作る良い方法は何ですか?サンプルコードがありますか?私は「キリン」のようなものを選ぶだけではいけないと思います
トニー・スターク

4

欠けているように見えるのは、ハッカーがデータベースにアクセスできる場合、パスワードをハッシュするphpファイルにもアクセスでき、それを変更してすべての成功したユーザー名とパスワードの組み合わせを送信できることです。彼がWebディレクトリにアクセスできない場合は、常にパスワードを選択してハッシュし、それをデータベースに書き込むことができます。つまり、ハッシュアルゴリズムはシステムセキュリティほど重要ではなく、SSLを使用しない場合でもログイン試行を制限すると、攻撃者は接続をリッスンして情報を取得することができます。(独自の目的で)アルゴリズムの計算に長い時間がかかる場合を除き、ユーザー固有のソルト使用したSHA-256またはSHA-512で十分です。

追加のセキュリティ対策として、スクリプト(bash、batch、pythonなど)またはプログラムを設定し、あいまいな名前を付けて、login.phpが変更されているかどうかを確認して(日付/タイムスタンプを確認)、メールを送信します。持っている場合。また、おそらくログイン時に管理者権限ですべての試行をログに記録し、データベースへのログインに失敗したすべての試行をログに記録し、ログを電子メールで送信する必要があります。


「欠けているように見えるのは、ハッカーがデータベースにアクセスできる場合、おそらくパスワードをハッシュするphpファイルにもアクセスできるということです...」これは真実ではありません。最も一般的な脆弱性の1つはSQLインジェクションです。SQLインジェクションは、データベースへの読み取り/書き込み機能を提供しますが、PHPコードへのアクセスはありません。
ceejayoz 2015

コードにアクセスできる場合は、ユーザーが送信するすべてのパスワードをプレーンテキストで変更および保存できます。コードが危険にさらされている場合、ゲームオーバーです。
magallanes 16

3

誰もがインターネットを介してハッキングされる可能性があるように、これについて話しています。すでに述べたように、試行を制限すると、インターネットを介してパスワードを解読することが不可能になり、ハッシュとは何の関係もありません。

塩は必須ですが、複雑さや複数の塩は問題になりません。塩だけで、攻撃者は既製のレインボーテーブルを使用できなくなります。ユーザーごとに固有のソルトは、攻撃者がユーザーベース全体に対して使用する新しいレインボーテーブルを作成するのを防ぎます。

データベース全体が危険にさらされ、ハッカーがmd5ハッシュに対して毎秒1億回のパスワード試行を実行できる場合、セキュリティが実際に機能します。SHA512は約10,000倍遅くなります。今日の能力を備えた複雑なパスワードは、md5で総当たりするのに100年かかり、SHA512の場合は10,000倍の時間がかかります。塩は常に知られている必要があるため、ブルートフォースを完全に停止することはありません。攻撃者がデータベースをダウンロードした場合、彼はおそらくあなたのシステムにいたはずです。


1

衝突の問題のため、MD5は良くありません。2つの異なるパスワードが同じmd-5を生成している可能性があります。

これはSha-1で十分安全です。塩漬けのsha-1バージョンのパスワードを保存する理由は、他の人のサーバーで使用している可能性があるため、管理者がユーザーのapasswordをファイルに保存しないようにするためです。それ以外の場合、どのような違いがありますか?

ハッカーが暗号化されていないデータベース全体を何らかの方法で盗んだ場合、ハッシュ化されたソルトパスワードは、ユーザーが将来のサインオンのために偽装するのを防ぐだけです-ハッカーはすでにデータを持っています。

ユーザーが入力したものが単純なパスワードである場合、攻撃者はハッシュ値を使用することでどのようなメリットがありますか?

そして、将来の技術を備えたハッカーがブルートフォース攻撃で毎秒100万のsha-1キーを生成する可能性があるとしても、ハッカーがキーをテストするためにサーバーが毎秒100万回のログオンを処理するでしょうか。これは、ハッカーに通常のログオンのようなパスワードではなく、salt付きのsha-1を使用してログオンさせようとしている場合です。

最善の策は、不正なログオン試行を適切な数(25など)に制限してから、ユーザーを1〜2分タイムアウトにすることです。また、badyログオンの累積試行回数が24時間以内に250に達した場合は、アカウントアクセスをシャットダウンし、所有者に電子メールを送信します。


たとえ弱い暗号化を使用していても、1秒あたり100万回以上の総当たり攻撃を保持できるシステムはほとんどありません。
magallanes 16

1
ログインに3回失敗すると、ロックアウトされます。期間、物語の終わり。「1234」などの非常に愚かなパスワードでも安全です。ハッカーが最初に「password」、「pa $$ word」、「passw0rd」を試してみると(ロックアウト!)、ユーザーがアクセスを取り戻す方法がセキュリティの固定ポイントになり、実行する操作はユーザーベースのサイズによって異なります。200ユーザー?彼らに助けを求めるために電話をかけてもらう。
UncaAlby 2016

この答えは他の誰にも意味をなさないのですか、それとも私だけですか?
ワイルドカード2016年


1

argon2iを使用しますargon2パスワードのハッシュ関数は、パスワードのハッシュ競争を獲得しました。

Argon2を使用できない場合のその他の合理的な選択肢は、scryptbcrypt、およびPBKDF2です。ウィキペディアには、これらの機能のページがあります。

MD5、SHA1、SHA256はメッセージダイジェストであり、パスワードハッシュ機能ではありません。この目的には適していません。

MD5からSHA1またはSHA512に切り替えても、構造のセキュリティはそれほど向上しません。SHA256またはSHA512ハッシュの計算は非常に高速です。一般的なハードウェアを使用する攻撃者は、1秒あたり数千万(単一のCPUを使用)または数十億(単一のGPUを使用)のハッシュを試行する可能性があります。適切なパスワードハッシュ関数には、辞書攻撃を遅くするための作業要素が含まれます。

PHPプログラマへの提案は次のとおりです。PHPFAQを読んでから、password_hash()を使用してください


0

次の点を想定してみましょう。ハッカーはユーザーとパスワード(暗号化)を含むデータベースを盗みます。そして、ハッカーは自分が知っているパスワードで偽のアカウントを作成しました。

MD5は脆弱で、MD5は短くて人気があり、事実上すべてのパスワードなしのハッシュ生成は辞書攻撃に弱くなっています。だが..

したがって、SALTでまだMD5を使用しているとしましょう。ハッカーはSALTを知りませんが、特定のユーザーのパスワードを知っています。したがって、彼らはテストできます:????? 12345ここで、12345は既知のパスワードで、????? 塩です。ハッカーは遅かれ早かれSALTを推測できます。

ただし、MD5 + SALTを使用してMD5を適用した場合、情報を回復する方法はありません。ただし、繰り返しますが、MD5はまだ短いです。

たとえば、パスワードが12345だとします。SALTはビルクリントンです。

md5:827ccb0eea8a706c4c34a16891f84e7b

ハッシュ付きmd5:56adb0f19ac0fb50194c312d49b15378

md5上のハッシュを含むmD5:28a03c0bc950decdd9ee362907d1798aこれらのオンラインサービスを使用しようとしたところ、解読できるものが見つかりませんでした。そして、その唯一のMD5!(今日のようになるかもしれませんが、md5をオンラインで生成したため、クラック可能になります)

やりすぎたい場合は、SHA256をソルトと2回適用すると十分です。

tldr MD5(HASH + MD5(password))=わかりましたが、SHA256で十分です。


ソルトでMD5を使用する場合の問題は、コンピューターが1つのパスワードに対してブルートフォース攻撃を超高速で作成できることです。shylor.com/2015/09/14/php-5-5-secure-password-hashing
Shylor

0

md5暗号化は最悪の1つです。コードをオンにする必要があり、すでに復号化されているためです。SHA256をお勧めします。私は少し長くプログラミングしていて、良い経験をしました。以下も暗号化されます。

password_hash() example using Argon2i

<?php
echo 'Argon2i hash: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>
The above example will output something similar to:

Argon2i hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.