2012-01-04 1 views
1

ユーザーにパスワードのみを要求する公開アプリケーションでRijndael(この場合はRijndaelManaged from .NET)を使用すると、initvectorを作成する最善の方法と塩?私は(おそらく)それらを生成+格納することはできません(アプリケーションによって生成されたドキュメントはパスワードだけで他のシステムで開く必要があるため)。公共アプリケーションでRijndael initvectors/saltを使用する

パスワードから何とか生成するのはいいですか? shaと同じようにパスワードを入力して、saltとinitvectorを生成しますか?

誰でも安全な方法で私を助けることができますか?

答えて

4

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 }; 
+0

各ユーザーがアカウントを作成するときに、一定の塩ではなく、疑似ランダムに生成されたユーザーごとの塩を保存することができます。そのユーザーのPBKDFへの入力として塩を使用します。すべてのユーザーに渡って一定の塩が存在するのはセキュリティの弱点です。 – rossum

+0

@ロッサム:私は、一定の塩がセキュリティを弱め、理想的にはユーザーごと、または暗号化ごとの塩を必要とすることに同意します。しかし、OPは彼らの疑問の中で、何かを保管することが彼らの状況では困難または不可能であることを示唆している。 – LukeH

+0

おっと、私はそれを選んでいない。 1つの解決方法は、可変塩を生成するために固定塩およびパスワードを使用し(おそらく反復回数を少なくする)、可変塩を使用してIVおよびキーを生成することである。訂正してくれてありがとう。 – rossum

関連する問題