6 セキュアなコーディング・ガイダンス
プレーンテキストの不要なインメモリー・バッファリングの回避
Cipher
メソッドupdate
およびdoFinal
は、データ・ストリーミングをサポートします。 ただし、AES KeyWrapアルゴリズム(「RFC 3394: Advanced Encryption Standard (AES)キー・ラップ・アルゴリズム」で定義)を使用する暗号変換(AESWrap、AESWrapPad、AES/KW/NoPadding、AES/KWP/NoPaddingなど)は、入力データを完全に処理する前にすべての入力データが使用可能である必要があるため、データ・ストリーミングには依存しません。 その結果、AESWrap変換Cipher
オブジェクトがENCRYPT_MODE
操作で初期化されると、update
メソッドに渡されるプレーン・テキストが内部バッファにコピーされ、後続のdoFinal
メソッド・コール中に後で処理されるようになります。 Cipher
オブジェクトの内部プレーン・テキスト・バッファは、doFinal
の起動時またはCipher
オブジェクトのガベージ・コレクション時にゼロになり、解放されます。 プレーン・テキストがAESWrap変換Cipher
オブジェクトによってバッファされないようにするアプリケーションでは、update
をコールしないでください。 たとえば、次のコードを考えてみましょう。
Cipher wrapper = Cipher.getInstance("AESWrap");
wrapper.init(Cipher.ENCRYPT_MODE, secretKey);
wrapper.update(plaintext);
byte[] cipherText = wrapper.doFinal();
次の行に置き換えることができます。
Cipher wrapper = Cipher.getInstance("AESWrap");
wrapper.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = wrapper.doFinal(plaintext);