1つのオプションは、Rfc2898DeriveBytes
、別名PBKDF2を使用して、パスワードからキーとキーを生成することです。
同じ入力(パスワード、塩、反復回数)を指定すると、PBKDF2は毎回同じシーケンスのバイトを生成し、IVとキーに使用できます。
理想的には、暗号化されたドキュメントごとに異なる塩を使用し、その塩をドキュメントの横に保存するのが理想ですが、制約のように聞こえるのはあなたがこれを行うことができないということです。一定塩。理想的ではありませんが、ほとんどの状況で問題をあまりにも多く提示するべきではありません。
public void DoSomething(string password)
{
byte[] iv, key;
// default iteration count is 1000 if you don't specify in the constructor
using (var deriveBytes = new Rfc2898DeriveBytes(password, _salt))
{
iv = deriveBytes.GetBytes(16); // get 16 bytes for the iv
key = deriveBytes.GetBytes(16); // get another 16 bytes for the key
}
// now use iv and key to setup RijndaelManaged to encrypt or decrypt
}
// shared, constant salt - make this as long and unguessable as you like
private static readonly byte[] _salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
各ユーザーがアカウントを作成するときに、一定の塩ではなく、疑似ランダムに生成されたユーザーごとの塩を保存することができます。そのユーザーのPBKDFへの入力として塩を使用します。すべてのユーザーに渡って一定の塩が存在するのはセキュリティの弱点です。 – rossum
@ロッサム:私は、一定の塩がセキュリティを弱め、理想的にはユーザーごと、または暗号化ごとの塩を必要とすることに同意します。しかし、OPは彼らの疑問の中で、何かを保管することが彼らの状況では困難または不可能であることを示唆している。 – LukeH
おっと、私はそれを選んでいない。 1つの解決方法は、可変塩を生成するために固定塩およびパスワードを使用し(おそらく反復回数を少なくする)、可変塩を使用してIVおよびキーを生成することである。訂正してくれてありがとう。 – rossum