機密キーを文字列ではなくchar[]として保存する方が、メモリ内にあるため、文字列として保存する方がよいとどこかで読みました。また、JPasswordFieldのgetText()メソッドが非推奨になっているため、少し意味があります。
これは本当ですか?
機密キーを文字列ではなくchar[]として保存する方が、メモリ内にあるため、文字列として保存する方がよいとどこかで読みました。また、JPasswordFieldのgetText()メソッドが非推奨になっているため、少し意味があります。
これは本当ですか?
でパスワードの使用を終えたら、char[]
いつでも0またはランダムな値で上書きできます。String
ただし、オブジェクトはJavaでは不変のオブジェクトであり、ガベージコレクターが起動してクリアするまで文字列は存続するため、オブジェクトを使用してこれを行うことはできません。
これはhttp://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.htmlにある興味深いメモです。
この例では、暗号化キーを取得するためのパスワードの入力をユーザーに求めます。
パスワードを収集してjava.lang.String型のオブジェクトに格納することは論理的であるように思われます。ただし、注意点は次のとおりです。String型のオブジェクトは不変です。つまり、使用後にStringの内容を変更(上書き)またはゼロ化できるメソッドは定義されていません。この機能により、Stringオブジェクトは、ユーザーパスワードなどのセキュリティ上の機密情報の保存には不適切になります。代わりに、セキュリティ上の機密情報を常に収集してchar配列に格納する必要があります。
そのため、javax.crypto.spec.PBEKeySpecクラスは、パスワードをchar配列として受け取ります(そして返します)。