アプリケーションに、最も安全で信頼性の高い形式の対称鍵暗号を実装したいと考えています。ユーザーは暗号化/復号化するためのパスワードを入力する必要があり、それだけです。RijndaelManagedの場合、キーとIVを入力する必要があります。どう対処したらいいのかわからない。現在、入力したパスワードはSHA256によってハッシュされ、Rijndaelのキーとして使用されています。IVには何を使用しますか?別のパスワード?
3 に答える
を使用してGenerateIV
(でオーバーライドRijndaelManaged
)、IVを生成できます。その後、暗号文と一緒にIVを送信できます。IVは、塩のように機能するものと考えることができます。基本的に、同じ平文が毎回同じ暗号文に暗号化されるのを防ぎます。IVを再利用しないでください-それは無意味になります。メッセージごとに新しいメッセージを生成します。
パスワードからキーを取得するための特別な機能があり、ハッシュよりも安全だと思います。Rfc2898DeriveBytesクラスを検索することをお勧めします。
Salt
とパスワードが必要です。暗号化されていないIV(およびSalt)をメッセージに追加することは受け入れられている方法です。
Rijndaalクラスのインスタンスを作成すると、IVが自動生成され、送信者はそれを使用できます。
Jon SkeetはIVについては正しいですが、キーを取得する方法にも問題があります。
プレーンテキストのパスワードでSHA256を1回使用するだけでは、安全ではありません。これにより、システムは単純な辞書攻撃にさらされたままになります。
プレーンテキストのパスワードを取得し、それらから暗号鍵を作成するように設計された関数のクラスがあります。これらは「鍵導出関数」です。キーを生成するには、これらのいずれか(PBKDF2が適切な選択)を使用する必要があります。このRfc2898DeriveBytes
クラスはPBKDF2を実装しています。
KDFにはソルトが必要です。ソルトは毎回ランダムに生成され、暗号文と一緒に含まれます(IVと同様)。