web-dev-qa-db-ja.com

データベースのパスワードセキュリティ-今日でもベストプラクティスは?

可能性のある重複:
どのパスワードハッシュ方式を使用する必要がありますか?

スタックオーバーフローや他のサイトのデータベースのパスワードセキュリティについては、すばらしい投稿がたくさんあります。私はこれにまったく慣れていないので、過去数日間、かなりの時間をかけてパスワードの詳細を学びました。しかし、非常に多くの異なる提案やベストプラクティスがあり、私はまだ非常に混乱しています...

また、2007年から2010年までの古い投稿はまだたくさんあります。物事がどれだけ速く変化するかを見たので、これがまだ彼らの提案どおりに使用するのが一般的かどうかはわかりません。だから、私は投稿で見つけたものを要約し、見つけたこの方法が良い習慣であるかどうかを尋ねたかったのです...

したがって、これはガイドではありませんが、要約です。これは非常に基本的なものであることを知っています。間違いがある場合は修正してください。

  1. ただ言及するだけです:プレーンテキストのパスワードを保存してはいけません:)
  2. パスワードを「一方向」にハッシュするため、誰もプレーンテキストを見ることができません。ユーザーがパスワードを入力すると、同じ方法でパスワードをハッシュし、データベース内のハッシュされたパスと比較します。
  3. パスワードをハッシュするだけでなく、ソルトする必要があります。プレーンなパスワード文字列にソルトを追加し、新しい文字列をハッシュします。プレーンなパスワードが弱い場合、saltを追加すると、長くて強力になります。
  4. さらに、塩はランダムである必要があります(「塩」という用語はとにかくランダムであることを意味します。それ以外の場合は「キー」と呼ばれていましたか?)。これは、レインボーテーブル攻撃を防ぐためです。攻撃者はソルトごとに1つのテーブルを作成する必要があるため、時間などの点ではるかにコストがかかります。また、2人のユーザーが同じパスワードを使用している場合、ランダムソルトを使用すると認識されません。
  5. 塩は秘密ではありません!ハッシュされたパスワードの隣のデータベースに保存されています。ただし、タイムスタンプ、ユーザーの電子メールアドレス、またはユーザーに接続されているその他のものをランダムなソルトとして使用することは、最善の方法ではない場合があります。理由としては、ユーザーは複数のサイト/サービスで同じパスワードを使用する傾向があると述べました。だから、塩はランダムな文字列でなければなりません、私が読んだのは64ビットでしょうか?
  6. 次のステップは、ハッシュプロセス(1000回以上のループ)に反復を追加することです。これにより、ソルトがパスワードに追加され、それらが繰り返しハッシュされます。これは、ユーザーがログを記録するときにほんの一瞬だけ待つことを意味しますですが、DBに10.000のエントリがある場合は合計します。
  7. たとえば、次の場所に保存されているサイトキーを追加すると、わずかなメリットになる場合があります。ソルトに加えてグローバル変数として。ただし、攻撃者がファイルシステムにもアクセスできると常に想定する必要があります。
  8. ハッシュアルゴリズム:MD5、SHA1、およびその他の弱い方法を使用することはもはや安全ではないことがわかりました...

それでは、SHA256、SHA512を使用するかどうかについてはさまざまな意見がありますか? hash_hmacを使用する必要がありますか?はいと言う人もいます:( http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/ )一部の人はライブラリの使用のみ安全な方法...そして、私がライブラリをbcryptまたはbubble fishとして使用しないように読んだ投稿で1回または2回?

ライブラリを使用することが本当に必要ですか、それともこのような方法で十分です:

function hash_password($password, $nonce) {

  for ($i = 0; $i < 5000; $i++) {
    $hashed_pass = hash_hmac('sha512', $hashed_pass . $nonce . $password, $site_key);
    }
  return $hashed_pass;
}

多くの人があなた自身のアルゴを発明しないと言っているので、私は自分で発明したものを使用するだけで少し怖いです。

予測するのは難しいと想像できますが、今日まで使用されている方法は、どれくらい安全であると見なすことができますか?

更新:それで、あなたのすべての素晴らしいフィードバックをありがとう。私が見て、多くの人が言ったように、欠けている重要な点が1つあります。パスワードのセキュリティ、つまり強力なパスワードが基本であることを意味します。メッセージを受け取ったと思います。ありがとうございました! :)

更新2:完了のために、私は http://www.lateralcode.com/creating-a-random-string-with-php/ で次のコードを見つけました。これは、ランダムなソルトを生成するために使用します:

function Rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!§$%&/().-:;_#+*[]{}="; 

    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ Rand( 0, $size - 1 ) ];
    }

    return $str;
}

$random_salt= Rand_string(20);
47
Chris

一般情報:

いい質問ですが、私が言えることは、それは完全に使用法に依存するということです。小さなWebサイトでのみ使用する場合、「スクリプトキディ」だけが訪問する可能性が高くなります。その場合、塩を含む単純なSHA1で十分です。この場合、5〜8〜10年、あるいはそれ以上であればまったく問題ありません。スクリプトキディは、簡単に侵入できないことがわかっても、実際には侵入しません。金銭的サイトなど、何らかの理由でサイトが攻撃される場合は、利用可能な最新の機能を使用する必要があります。この場合、非公式ではあるがすでに移植された関数を使用することも「リスク」があります。現在、SHA3コンペティションがあり、高額の資金が投入されるwebstiesのために、私はこれらの5つのライバルの1つを使用します。

重要だと私が言っている点:

1。ランダムなソルトを使用します。おそらく20文字です。パスワードを解読するのは非常に難しく、たとえ解読可能であっても、価値があるようになるには時間がかかりすぎます。
2。 SHA-1、SHA-2、またはWHIRLPOOLを使用します。良い塩で、MD5も同様にOKですが、私はまだこれらをお勧めします。
ユーザーのパスワードが簡単なものであれば、優れた暗号化を使用できます。大文字、小文字、数字、記号を含む辞書以外の長いパスワードを使用していることを確認する必要があります。そうしないと、ブルートフォースによって簡単に破られてしまいます。あなたは彼らが毎年かそこらでパスワードを変更することを余儀なくされる可能性があると考えるかもしれません。

コードへ:

何度もループするのは便利かもしれませんが、5000は必要ないと思います。通常のセキュリティでは3、つまり100、おそらく1000で十分ですが、5000では多すぎると思います。 SHA-256は良いですが、そのために特別に開発されたアルゴリズムを使用できます。コメントを参照してください。

2
axiomer

あなたは一つだけのことを忘れました:

パスワードの強度。

あなたの素晴らしいトピック全体を太りすぎているたった2語。

Stackoverflowには、これまたはそのハッシュアルゴリズムとランダムソルトを使用するように指示する何百ものトピックがあります。
そして、弱いパスワードですべての8項目リストの保護、2048バイトの長さの塩のすべての余分な安全なhmac-chmak-bumblemakハッシュがほんの数秒で壊れることを説明することはほとんどありません。

思い出せない貧しいユーザーは$#%H4df84a$%#Rパスワード-パスワードではなくパスフレーズを使用するようにします。

Is it a good day today, Winkie?異なる大文字の文字と推奨される複雑さのパスワードを使用しますが、覚えやすくなります。

もちろん、このフレーズは「ジョー」や「123」のような一般的なパスワードほど一般的であってはなりません。
「おはよう」、「オーマイゴッド!彼らはケニーを殺した!」フレーズは避けてください。
しかし、いくつかの個性を追加することにより、それは大丈夫でしょう:
Oh My God! They moved Cthulhu!十分に見える

もう1つ言及するのは、サーバーとブラウザ間の安全な通信です
これがないと、通信に関与しているすべてのルーターでプレーンなパスワードを簡単に「盗聴」できます。

SSHまたは ダイジェスト認証 の実装は、それほど重要ではありません。

10

現在の計算能力を考えると、優れたハッシュを備えた汎用ハッシュ関数(MD5、SHA1、SHA256)は、ほとんどの小規模なWebサイトに対して十分に安全である可能性があります。ただし、ムーアの法則により、適切なパスワードであっても、近い将来ブルートフォース攻撃にさらされることになります。問題は、ハッシュ関数の計算が速すぎることです。最善の解決策は、bcryptまたはPBKDF2を多数の反復で使用することです。 Bcrypt vs PBKDF2http://security.stackexchange.com で議論されました。

これはほとんどのサイトにとってはやり過ぎだと考える人もいますが、パスワードは常に再利用され、パスワードの保存は通常、問題が発生するまで変更しないことを覚えておいてください。

推奨事項:

  1. BcryptまたはPBKDF2を使用します。 SHA3​​候補は使用しないでください。まだ発見されていないセキュリティホールが含まれている可能性があります。
  2. ランダムな塩を使用して、レインボーテーブルの攻撃から保護します。
  3. ユーザーにパスフレーズを選択させる。

詳細

5
tony

hash_hmac()関数は良い選択です。弱いハッシュアルゴリズムの問​​題を克服することもできます。唯一の問題は、too高速であることです。つまり、十分なCPUパワー(クラウド)があれば、異なるRainbowテーブルの作成が可能になります。これが反復の理由です。この高いセキュリティが必要な場合は、反復に必要な時間を測定し、特定の時間に必要な反復の数を計算できます。

編集:

反復はこの問題を解決できます。既存のハッシュを無効にすることなく、後で反復回数を増やすことができるような方法で行う必要があります。これは新しい将来のハードウェアに適応するために必要ですが、ハッシュと共にハッシュパラメータを格納する必要があります。

Bcryptハッシュアルゴリズムはこの要求を満たすように設計されており、使用方法の小さな例 bcrypt with PHP 5. を書いたので、コメントしようとしたので、何が起こっているのかを理解する。

2
martinstoeckli