KeyGenerator
を使用するのが好ましい方法です。ダンカンが指摘したように、私は初期化中にキーサイズを確かに与えるでしょう。 KeyFactory
は、既存のキーに使用する方法です。
OKだから、これは根性に欠けます。原則として、AESキーは任意の値を持つことができます。 (3)DESのように「弱い鍵」はありません。 (3)DESパリティビットのように特定の意味を持つビットもありません。したがって、キーの生成は、ランダムな値を持つバイト配列を生成し、その周囲にSecretKeySpec
を作成するのと同じくらい簡単です。
しかし、使用している方法にはまだ利点があります。具体的には、KeyGenerator
がキーを生成するために作成されています。これは、この世代のためにコードを最適化できることを意味します。このにはに効率性とセキュリティ上の利点があります。たとえば、キーを公開するタイミング・サイド・チャネル攻撃を回避するようにプログラムすることができます。重要な情報を保持しているbyte[]
をクリアすることは、既にスワップファイルに漏洩している可能性があるので、あらかじめ解読することをお勧めします(これはとにかく可能性があります)。
さらに、すべてのアルゴリズムが完全ランダムキーを使用しているわけではありません。したがって、KeyGenerator
を使用すると、他のアルゴリズムに簡単に切り替えることができます。より現代的な暗号は完全にランダムな鍵だけを受け入れます。これは、例えば、 DES。
最後に、私の場合、最も重要な理由は、KeyGenerator
メソッドが、安全なトークン(スマートカード、TPM、USBトークンまたはHSM)内のAESキーを処理する唯一の有効な方法だということです。 でbyte[]
を作成した場合、のキーはでなければなりません。つまり、鍵は安全なトークンに入れられるかもしれませんが、鍵はメモリに関係なく公開されます。通常、セキュアトークンは、セキュアトークンで生成されるか、例えば、スマートカードまたはキー式である。 KeyGenerator
は、鍵がセキュアトークン内で直接生成されるようにプロバイダに提供することができます。
Duncan's answerに示されているとおり、常にキーサイズ(および他のパラメータ)を明示的に指定します。 がになると、アプリケーションの動作が不明確になり、各プロバイダに独自のデフォルトが設定される可能性があるため、プロバイダのデフォルトに頼らないでください。
とランドを置き換えるこのmighthヘルプhttp://stackoverflow.com/questions/10252449/is-aes-key-random – Tala
@Talaこれは、[引用されたコード]を見つけた場所です(http://stackoverflow.com/a/10252662/1005481)。しかし、その投稿から、私はランダムキーを作成する方法とそれがなぜ安全な方法であるかについてのコンセンサスを決定することができませんでした。 –