web-dev-qa-db-ja.com

エンタープライズレベルのパスワードハッシュ

ログインサービス用のハッシュクラス(C#)をいくつか作成する必要がありますが、(残念ながら)パスワードをSQLサーバーデータベースに保存する必要があります。以前はBCryptまたはPBKDF2を使用してきましたが、いくつかの懸念事項があります。これは、米国で実行されているエンタープライズレベルのソリューション用です。コメントしてほしい有効なパスが3つあります。

BCrypt:NIST標準ではないため、一部のお客様にはこれが必要になる可能性があります。また、大企業や一部の専任開発者に支えられたものが必要なため、BCryptをエンタープライズレベルのソフトウェアに使用することにも消極的です。私が見つけることができるのは、1人の男が暇なときに管理している(古い)実装の一部だけです。それはいくつかの懸念を引き起こすべきではありませんか?アルゴリズム自体は素晴らしいですが、実装はそうではないかもしれません。そして確かに維持する必要があります。

2016年のイテレーション(ワークファクター)推奨-12とは何ですか?

PBKDF2:C#で見つけることができる唯一のソリューションは、Microsoftの「PasswordHasher」(または同様のRfc2898DeriveBytes実装)です。リリースされたバージョンは、1000回の反復でHMAC SHA1を使用しています。これは2016年には無効のようです。新しいバージョン here がありますが、それはNugetのプレリリースのようです。いずれの場合も、静的反復数が10000のHMAC SHA256を使用しているだけです。2016年にこれが少なくとも256000であると予想します。また、コードを見ると、実装は、背後にある傾向があるいくつかのWin8Pbkdf2Providerを呼び出します。 BCrypt派生物(とにかく私のNIST要件を困難にします)。

SHA1 + AES:別のアプローチは、HMAC SHA1を使用して標準のRfc2898DeriveBytesを使用し、次にAESを使用してデータベース値を暗号化する-AESキーを格納することですディスク上。私は実際にこのアプローチが一番好きですが、これらのことを検索すると、その解決策は決して表示されないので、何かが足りないかもしれません...

皆さんは何をお勧めしますか?エンタープライズレベルのソフトウェアを保護するために何をしますか?

2
Werner

あなたの実際の要件は何ですか? 「エンタープライズレベル」はあまり意味がなく、少なくとも以下の大きなプロジェクトになります。 NISTが必要な場合は、PBKDF2で十分です。セキュリティの観点から、bcryptは、SHAバリアントに基づくPBKDF2よりも少し安全です。bcrypt自体が NISTが(まだ)何も言わない場合でも、PBKDF2の代わりに良い

実装に関しては、十分に確立されたライブラリを使用する必要があります。実装の詳細を手動で確認する必要はなく、確認する必要もありません。クイック検索の結果、C#コミュニティでサポートされているC#のbcrypt実装がいくつかあることがわかりました。

PBKDF2 vs bcrypt の詳細については、Thomas Porninの回答も参照してください。

更新

SHA1 + AESオプションは使用しません。これを行っても実際には問題は解決されませんが、特定の種類の攻撃のリスクが軽減されるだけです。それでも、アプリケーションが何らかの形でデータベースの内容をリークする場合は、SHA1でのみ信頼できます。それはhackのように私に感じます、そしてあなたが望む最後のことはあなた自身が何かを調理することです。

3
Yorick de Wid

BCryptを使用しない理由はわかりません。 BCrypt.Net という適切なライブラリがあります。

セキュリティは実装からではなくアルゴリズムからもたらされるため、他の既知のライブラリを使用して結果を直接ダブルチェックできます。失敗する可能性があるのは、安全なランダムソルトの生成です。ただし、ソースコードを見ると、DotNetライブラリの暗号化乱数ジェネレーターを使用していることがわかります。これは、正しく行われているためです。

2
martinstoeckli