web-dev-qa-db-ja.com

SHA1 vs md5 vs SHA256:PHPログインに使用するのはどれですか?

私は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);
132
Tony Stark

どちらでもない。 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](http://

Bcryptの2つの警告

  1. Bcryptは、72文字より長いパスワードを静かに切り捨てます。
  2. Bcryptは、NUL文字の後に切り捨てます。

Proof of Concept 両方の注意事項はこちら。)

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

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

TL; DR- bcryptを使用 .

106
Johannes Gorset

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

  1. ユーザーが神、愛、戦争、平和などの弱いパスワードを使用できるようにすると、暗号化に関係なく、ユーザーがハッシュではなくパスワードを入力できるようになり、これらのパスワードが最初に使用されることが多いため、これは- NOT暗号化とは関係ありません。

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

  3. ブルートフォース攻撃は弱いパスワードを利用します。ログイン制限が3またはそれ以上ない場合はユーザーがデータを入力できるため、問題は再び発生しますNOT haveデータの暗号化に関すること。

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

まだ暗号化する必要があると思いますが、暗号化で確認できるのは、データベースに既にアクセスしている、または何らかの方法でアクセスしているユーザーがパスワードを読み上げるのを防ぐことだけです。データベース上で許可されていない誰かがいる場合、暗号化されたパスワードはクレジットカード番号を含むすべてを保護し、その1つのフィールドを保護するだけであると考えたため、Sonyが採用した理由を心配する大きな問題があります。

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

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

22
Roger Johnson

Johannes Gorsetが指摘したように、 Matasano SecurityのThomas Ptacekによる投稿 は、MD5、SHA1、SHA256、SHA512などの単純な汎用ハッシュ関数が貧弱な理由を説明しますパスワードハッシュの選択肢

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

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

ユーザー@Willの発言:

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

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

その後、彼はオフライン攻撃のシナリオに戻ります。

データベース全体が危険にさらされ、ハッカーがmd5ハッシュに対して1秒あたり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 を参照してください

15
LexLythius

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

追加のメモ、FRKTとして、誰かが塩漬けのSHA256ハッシュを簡単に解読できる場所を教えてください。私はこれを見ることに本当に非常に興味があります。

重要な編集:

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


塩漬けの編集:

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

13
Kyle Rozendo

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

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

4

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

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

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

3
Will

衝突の問題により、MD5は不適切です。2つの異なるパスワードが同じmd-5を生成する可能性があります。

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

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

ユーザーが入力するのがプレーンパスワードである場合、ハッシュ値を取得することは攻撃者にとってどのような利点がありますか?

そして、将来のテクノロジーを備えたハッカーがブルートフォース攻撃のために1秒あたり100万のsha-1キーを生成できたとしても、ハッカーが自分のキーをテストするために、サーバーは1秒あたり100万のログオンを処理しますか?これは、通常のログオンのように、パスワードの代わりに塩漬けのsha-1を使用してハッカーにログオンを試行させる場合です。

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

1
Brad Jensen

argon2iを使用します。 argon2パスワードハッシュ関数は、パスワードハッシュコンペティションで優勝しました。

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

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

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

PHPプログラマ向けの提案を次に示します。 PHP FAQ を読んでから password_hash() を使用します。

1
Erwan Legrand

MD5とSHA1の比較を次に示します。あなたはどちらが良いかについて明確なアイデアを得ることができます。

enter image description here

1

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

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

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

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

たとえば、パスワードが12345だとしましょう。SALTはBILLCLINTONです

md5:827ccb0eea8a706c4c34a16891f84e7b

ハッシュ付きmd5:56adb0f19ac0fb50194c312d49b15378

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

過剰に使いたい場合は、SHA256を塩で2回適用すれば十分です。

tldr MD5(HASH + MD5(password) OK、しかし短い、SHA256は十分すぎる。)==

0
magallanes

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
0
Lars Gross