2013-06-19 17 views
5

誰もが任意の長さのパスフレーズから生成された256ビットの鍵の値を取得する方法を知っていますか?暗号化された値を再度生成してデータベース内で比較する必要があるため、暗号化を実行することはできません。そのため、値は暗号化されるたびに同じ暗号化文字列を生成する必要があります。AES 256ビットの鍵の値を生成する

現在、私は32ビットのキーを使用していますが、これはおそらく256ビットであるという誤った仮定に基づいていますか?

だから、「クイックブラウンキツネ」を適切なAES 256ビットキーに変換したいと思っていますか?

+2

"暗号化された値を再度生成する必要があるため、暗号化を行うことはできません"そのため、ハッシュされたパスワードと共に塩を保存するのが一般的です。このように、2人の異なるユーザーが同じパスワードを持つ場合、異なるハッシュが生成されますが、1人のユーザーの場合、同じパスワードは常に同じハッシュを生成します。 – svick

+0

は正直で、塩がないと実際には全く暗号化されません。暗号化された値に対して直接データベース検索を行うことはできません。 – Matthew

答えて

12

あなたは、任意の大きさのパスワードを使用してRfc2898DeriveBytes Classを構築してから、この場合には256ビット(32バイト)をご希望のサイズの鍵を導出することができます

決定論的出力を生成するために
private static byte[] CreateKey(string password, int keyBytes = 32) 
{ 
    const int Iterations = 300; 
    var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations); 
    return keyGenerator.GetBytes(keyBytes); 
} 

(すなわち同じ入力が同じ出力を生成します)、塩をハードコードする必要があります。塩は、少なくとも8バイトでなければなりません:

private static readonly byte[] Salt = 
    new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80}; 
+0

上記の理論的な説明は私の説明を参照してください。 'Rfc2898DeriveBytes'はPBKDF2を実装していることに注意してください:) –

+0

ありがとうございます - これはとても役に立ちました。 32バイトのキー配列を取得するには、keySizeを32にする必要がありますか? – bhs

+0

はい、私はByteBlastの間違いだったと思います。また、Rfc2898DeriveBytes関数が使用するエンコーディングを明示的に指定していないため、UTF-8エンコーディングを使用してバイトにパスワードをエンコードするようアドバイスします。別のランタイムから関数を使用すると、それは難しいです。 –

-1

SHA256など、任意の長さの入力から256ビットの出力を提供するハッシュ関数を使用できます。

+1

正式には、ハッシュはパスワードベースのキー導出関数ではないため、そのまま使用するべきではありません。 –

2

おそらく最良の方法は、(256ビットの出力を生成します)SHA256およびアプリケーション固有の塩&反復カウントを使用してPBKDF2を使用することです。アプリケーション固有のソルトを使用するとPBKDF2からの保護が大幅に削除されたので、この問題を緩和するために追加の保護が必要な場合があることに注意してください。 1つの方法は、データベースが安全であり、最大限試行できることを確認することです。

32文字のパスフレーズが256ビットのキーではないことを正しく示しています。それは十分なエントロピーを含んでおらず、いくつかのバイトは有効な文字表現さえないかもしれません。

+0

上記の実装のByteBlastsの答えを参照してください:) –

+0

ありがとうございます - 上記の方法の32バイト配列は256ビットのキーですか? – bhs

+0

これはパスワードベースのキー導出関数で、PBKDFの意味です。パスワードを入力すると、キーバック(バイト)が得られます。これは、塩と複数の反復を使用して保護されているため、キーを計算するのが比較的難しくなります(あなたと攻撃者の両方)。攻撃者はおそらくキーに到達するためにそれらの多くを行う必要があります。ただし、SHA-256以上を使用することが最善です。なぜなら、1つのハッシュアウトプット以上のものに対しては完全な反復回数を実行する必要があります。これは攻撃者ではなくバグの可能性が高いからです。 –

関連する問題