C#やJavaのパスワードを一方向にハッシュするリファレンス実装(理想的にはサードパーティ認定、または 政府承認 )を持っている人はいますか?
理想的には、前述の「ソルトアンドペッパー」手法 ここ だけでなく、他の 現代のセキュリティ手法 を含む検証結果mightが適用される場合があります。
保護したいコンテンツは、パスワードやチャレンジ質問への回答など、ユーザーが覚えることができる情報です。
完全なコードサンプルがない場合は、どのアルゴリズムを選択するかについての一般的な説明と、ソルト処理とペッパー処理の方法の例が役立つでしょう。
あなたの新しい「政府承認」要件を考えると、1つの適切な解決策は RFC 2898 のPBKDF2であろうと思います。 Rfc2898DeriveBytes Class(System.Security.Cryptography) で.NET用に実装されています。おそらくそこでSHA-1をSHA-256に置き換えたいと思います。
また、かなり安全なハッシュ化パスワード fshp にも出くわしました。これはPBKDF1に似ていますが、デフォルトではSHA-256です。反復回数は可変で、デフォルトは4096です。64ビットのソルトを使用します。 .NET、Python、Ruby、Perl、PHP5、JavaおよびJavaScriptの実装があります。
bcryptの.net impl-Stack Overflow で説明および説明されているように、.NET/CLRの場合、別の適切なオプション(NIST承認ではない)がBCrypt.netのようです。
Javaの場合、適切なオプションは
どちらにも「コショウ」の概念も、scryptのスペースの複雑さもないようです。
基本的なアプローチはHash(secret | salt)
で、これはソルトとともに保存されます。明らかに、SHA2バリアントの1つのような最新のハッシュアルゴリズムを使用することが重要です(現在、SHA1はMD5のように完全に壊れているわけではありません)。この方法でチャレンジ質問を保存している場合は、ハッシュする前にシークレットをTrim()
およびToLower()
することをお勧めします。これにより、多少複雑さが軽減される可能性がありますが、セキュリティの質問はとにかくパスワードのように高いエントロピーを持つことを意図していません。
ブルートフォース攻撃に関する懸念は、次の2つの方法で軽減できます。
bcrypt
で使用されている方法は、ハッシュを計算するための時間を桁違いに増やすため、標準のハッシュの優れた改善点です。基本的に、シークレットは何度も繰り返しハッシュされます:Hash(Hash(...Hash(secret | salt)...))
時間はまだ比較的短い(数百ミリ秒)ため、正当なユーザーに許容できない遅延が追加されることはありません。しかし、自動ブルートフォース攻撃を台無しにする可能性があります。
bcrypt
の追加の難しさが不十分な場合は、 scrypt
を試してください。 bcrypt
のように機能しますが、最後の最終的なマージのために、各反復ハッシュをメモリに保存する必要があります。これにより、bcrypt
と同じ時間の複雑さが追加されますが、スペースの複雑さが増し、ハードウェアでの実装、特に並列での実装がより困難になります。
正直なところ、これを実装するC#ライブラリは知らず、公的機関によって「認定」されているものは言うまでもありませんが、それほど難しくはありません。スレッドセーフなコードを記述し、パスワード検証がサーバーなどの信頼できるシステムで行われると仮定すると、 サイドチャネル攻撃 などの実装に関する懸念は最小限に抑えられます。
さらに読む: この答え toBCryptはC#で使用するのに適した暗号化アルゴリズムですか?どこにありますか?
。正解:
によると この投稿 すべて-Cngおよび-CryptoServiceProvider。Net CryptographyNamespace からのポストフィックス実装は、FIPS認定である必要があります。 -管理バージョン。
欠点:
利点: