135

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

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

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

$salt = createSalt();

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

11 に答える 11

112

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

PHP5.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. NULBcryptは任意の文字の後に切り捨てられます。

(ここでは、両方の警告の概念実証。)

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

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

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

于 2010-02-10T07:48:58.927 に答える
22

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

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

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

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

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

それでも暗号化する必要があると思いますが、暗号化によって確認できる唯一のことは、データベースへのアクセス権を既に持っているか、何らかの形でアクセス権を取得した人がパスワードを大声で読み上げるのを防ぐことです. それがデータベース上で許可されていない誰かである場合、心配するより大きな問題があります。それが、暗号化されたパスワードがクレジットカード番号を含むすべてを保護していると考えたため、ソニーが採用された理由です。

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

私がこれを明確にしたいと思った理由は、パスワードが暗号化されていれば、パスワードが侵害されることを心配する必要がないと考えている人があまりにも多く、Web サイトの保護について心配することをやめてしまったからです。

于 2011-09-24T14:55:39.000 に答える
15

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

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

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

ユーザー @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を参照してください。

于 2010-09-08T18:33:48.040 に答える
13

を使用しSHA256ます。SHA512高速ハッシュに理想的であるため、完全ではありませんが、オプションから選択することは間違いありません。あらゆるハッシュ技術と同様に、セキュリティを強化するために必ずハッシュをソルトしてください。

追記として、FRKT さん、ソルト化された SHA256 ハッシュを簡単にクラックできる場所を教えてください。私はこれを見て本当に非常に興味があります。

重要な編集:

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


塩漬けの編集:

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

于 2010-02-10T07:58:28.957 に答える
4

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

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

于 2012-01-08T20:32:44.103 に答える
3

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

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

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

于 2011-06-14T13:51:21.977 に答える
1

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

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

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

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

また、将来のテクノロジーを使用するハッカーがブルートフォース攻撃に対して1秒間に100万のsha-1キーを生成する可能性があるとしても、ハッカーがキーをテストするために、サーバーは1秒間に100万のログオンを処理しますか?これは、通常のログオンのようにパスワードではなく、塩漬けのsha-1を使用してハッカーにログオンさせようとしている場合です。

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

于 2011-12-04T22:37:20.437 に答える
-1

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

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

ですから、まだ MD5 と SALT を使用しているとしましょう。ハッカーは 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)) = わかりましたが、短いですが、SHA256 で十分です。

于 2016-02-02T14:45:37.543 に答える