BCryptはC#で使用するのに適したハッシュアルゴリズムですか?どこで見つけることができますか?[閉まっている]


129

私はパスワードをハッシュするとき、多くのプログラマーがBCryptアルゴリズムの使用を勧めていることを読みました。

私はC#でプログラミングしていて、BCryptの適切な実装を誰かが知っているかどうか疑問に思っていますか?私はこのページを見つけましたが、それが偽物であるかどうかは本当にわかりません。

パスワードハッシュスキームを選択するときは、何に注意する必要がありますか?BCryptは「良い」実装ですか?

回答:


148

最初に、重要ないくつかの用語:

ハッシュ -文字列を取得し、元の文字列に戻すことができない一連の文字を生成する行為。

対称暗号化 -(通常は単に「暗号化」と呼ばれます)-文字列を取得し、 それを暗号化したのと同じ暗号化キーを使用して元の文字列に復号化できる文字シーケンスを生成する行為。

レインボーテーブル -特定のハッシュアルゴリズムでハッシュされた文字のすべてのバリエーションを含むルックアップテーブル。

ソルト -ハッシュされる前に元の文字列に追加される既知のランダムな文字列。

.NET Frameworkの場合、Bcryptにはまだ検証済みのリファレンス実装がありません。既存の実装に重大な欠陥があるかどうかを知る方法がないため、これは重要です。BCrypt for .NETの実装はこちらから入手できます。暗号化について、それが良い実装か悪い実装かを説明するのに十分な知識はありません。暗号化は非常に深い分野です。 独自の暗号化アルゴリズムを構築しないでください。真剣に。

独自のパスワードセキュリティ(ため息)を実装する場合は、いくつかのことを行う必要があります。

  1. 比較的安全なハッシュアルゴリズムを使用します
  2. ハッシュされる前に各パスワードをソルトします。
  3. パスワードごとに固有の長いソルトを使用し、ソルトをパスワードとともに保存します。
  4. 強力なパスワードが必要です

残念ながら、これをすべて行ったとしても、ハッカーがパスワードを見つけ出す可能性はありますが、非常に長い時間がかかります。それはあなたの主な敵です:時間

それがかかるのでbcryptのアルゴリズムが動作する5長いハッシュにMD5よりパスワードを桁違いに。(それでもAESまたはSHA-512よりはるかに長い)。これにより、ハッカーはパスワードを検索するためのレインボーテーブルを作成するのに多くの時間を費やす必要があり、パスワードがハッキングされる危険性がはるかに低くなります。

パスワードをソルトおよびハッシュしていて、各ソルトが異なる場合、潜在的なハッカーは、saltのバリエーションごとにレインボーテーブルを作成し、 salted + hashedのパスワード1つにレインボーテーブルを作成する必要があります。つまり、ユーザーが100万人いる場合、ハッカーは100万個のレインボーテーブルを生成する必要があります。すべてのユーザーに同じソルトを使用している場合、ハッカーはシステムをハッキングするために1つのレインボーテーブルを生成するだけで済みます。

パスワードをソルトしない場合、攻撃者が行う必要があるのは、そこにあるすべての実装(AES、SHA-512、MD5)の既存のRainbowテーブルをプルアップし、ハッシュに一致するかどうかを確認することだけです。これはすでに行われているため、攻撃者はこれらのRainbowテーブル自体を計算する必要はありません

これでも、適切なセキュリティプラクティスを使用している必要があります。彼らは成功し、他の攻撃ベクトル(XSS、SQLインジェクション、CSRF、使用できる場合らを。あなたのサイト上で)、適切なパスワードのセキュリティは問題ではありません。それは物議を醸す声明のように聞こえますが、それについて考えてください:SQLインジェクション攻撃を通じてすべてのユーザー情報を取得できる場合、またはXSSを介してユーザーにCookieを提供することができる場合、パスワードがどれほど適切かは問題ではありませんセキュリティです

その他のリソース:

  1. Jeff Atwood:.NET Encryption Simplified(ハッシュの概要に最適)
  2. ジェフ・アトウッド:私はあなたとしてログインしました
  3. ジェフ・アトウッド:おそらくパスワードを正しく保存していない
  4. Jeff Atwood:スピードハッシュ

注:他の優れたリソースを推奨してください。私は何十人もの作家による数十の記事を読んだことがあるに違いありませんが、ジェフのように主題について明快に書いている人はほとんどいません。見つけたら記事を編集してください。


塩をランダムに選択する必要があることを塩の段落に追加してください
Jacco

2
@Jaccoグッドコールを追加しました。それはそれほど重要ではありませんが。ログインのタイムスタンプをソルトに使用するだけです。違いは、攻撃者が各ソルトのレインボーテーブルを再計算する必要があることです。それがランダムに選ばれるということではなく、それが難しい理由です。ランダムにすると難読化の層がさらに追加されますが、攻撃者がデータベースを見ることができるようになると、それは役に立ちません(これは、最初から私たちのすべての心痛の原因となっている問題です)。
ジョージストッカー2011年

3
塩は必ずしも秘密である必要はなく、インスタンスごとに固有です。(世界全体のように)一意にすることはできないため、ランダムが次善の策です。また、十分なエントロピーがないためタイムスタンプは良い塩ではありません。
Jacco

7
「彼らがXSSまたはSQLインジェクションを正常に使用できれば、優れたパスワードセキュリティは問題ではありません。」逆に、XSSまたはSQLがサイトを正常に挿入できる場合は、優れたパスワードセキュリティがさらに重要です。ここで重要なのは「多層防御」です。アプリケーションのすべての層で実用的な範囲でセキュリティを強化する必要があります。
jammycakes 2011

2
@jammycakes絶対に。私のポイントは失われました:「ねえ、私たちはパスワードをハッシュ化してソルトします。
ジョージストッカー2014年

74

あなたは使用しないでください .NETでbcryptのを。組み込みの.NETフレームワーク実装では、PBKDF2をそのまま使用する必要あります。これは、.NETで唯一無料で利用できる暗号的に検証された実装であり、NISTが推奨するアルゴリズムでもあります

StackIdは以前にBCryptを使用しており、次の理由によりPBKDF2に移動しました。

それらの好奇心のために、PBKDF2でパスワードをハッシュしています。関連するコードがここにあります( http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135 )、いくつかの間接層があります。以前のイテレーションでは、BCryptを使用していました。.NETフレームワークに組み込まれているためPBKDF2に移動しましたが、BCryptでは実装を確認する必要があります(小さな作業ではありません)。

ケビンモントローズ、2011年5月27日

(GitHubの更新されたリンク)

編集:暗号化れた用語で検証された意味は容易に理解されないようです。検証された実装とは、エラーなしで実装されたことが暗号的に証明されていることを意味します。このコストは簡単に$ 20,000以上に達する可能性があります。私がOpenSSLの調査を行っていたときにこれを思い出し、検証プロセス全体が完了していないことを彼らが述べたところを読みましたが、完全に検証する必要がある場合は、彼らが正しいパスを指摘し、関連するコストを言及できることを確認しました。特定の政府の要件には、検証済みの暗号化アルゴリズムの義務が含まれています。

.NETのbcrypt実装は検証されていません。未検証の暗号化実装を使用すると、暗号化されたものへのバックドアの許可などの意図的な悪意のある障害や、暗号的に安全でないデータをもたらす意図しない実装の障害がないことを完全に確信することはできません。

2014年の編集:検証済みの暗号アルゴリズムを使用することの義務性に疑問を投げかける人のために、OpenSSLで悪用されたハートブレッドハックによって引き起こされた荒廃を見てください。それは未検証の実装を使用するコストです。それは安全です....だれでもサーバーのメモリの内容全体を読み取ることができることがわかるまでは。

Heartbleedを導入した変更の作成者であるRobin Seggelmannは、「長さを含む変数の検証に失敗した」と述べ、欠陥のある実装を提出する意図を否定しました。Heartbleedの開示に続いて、Seggelmannは2番目の側面に焦点を当てることを提案し、OpenSSLは十分な人々によってレビューされていないと述べました。

これは未検証の実装の定義です。最小の欠陥でも、セキュリティ全体が機能しなくなる可能性があります。

2015編集:推奨ベースの言語を削除し、絶対言語に置き換えました。後世に埋め込まれたオリジナルのKevin Montroseコメント。


25
リンクされたコメントを引用するには:「[.NET Frameworkに組み込まれているため、PBKDF2に移動しましたが、BCryptは実装を確認する必要があります」。コメントはアルゴリズムが優れているとは言っていないことに注意してください。SE開発チームは組み込みPBKDF2 実装を外部ライブラリ(最終的には判断コール)よりも信頼できると見なしているだけです。
Piskvorが建物を去った

3
@Piskvor回答を更新しました。これは、SOチームが安全であると考えるものではありませんが、本質的に安全であると証明されているか、できれば安全であるかの判断が必要です。暗号化に関しては後者は受け入れられません。
Chris Marisic、2011

6
SOがすべてのbcryptハッシュパスワードをどのように新しいハッシュに移行したのでしょうか。新しいアルゴリズムを使用してハッシュするために、生のパスワードは必要ないでしょうか?
Dharmendar Kumar 'DK' 2014

8
@DKパスワードの再設定を依頼する必要はないと思います。次回のログイン(彼らが平文のパスワードを提供する)で、あなたはそれを行うことができると私は信じています。
Matt Kocaj 14

12
これは貧弱なアドバイスであり、非常に多くの賛成票があることに驚いています。マネージ言語でBCrypt実装を検証することは、CでSSL実装全体を検証するよりもはるかに簡単です。Heartbleedは完全に無関係です。ハッシュ等価チェックでのPHP型の強制問題などについて言及したほうがよいでしょう。さらに、PBKDF2は実用的な意味で大部分が適切ですが、パスワードハッシュアルゴリズムではなくKDFですが、BCryptの方が適しています。いずれにせよ、とにかく最近、Argon2を使用する方がはるかに理にかなっており、十分にテストされたC#ライブラリがあります
多項式
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.