2017-02-03 8 views
6

重要なデータの場合はStringの代わりにchar[]を使用するこの提案/実践について既に知っています。それには複数の理由があります。一つは、彼らはもはや必要ありません直後機密データをクリーンアップすることです:今 Javaの機密データ:char [] vs String?ポイントは?

char[] passwd = passwordProvider.getKeyStorePassword(); 
KeyStore keystore = KeyStore.getInstance("JKS"); 

// TODO: Create the input stream; 
keystore.load(inputstream, passwd); 

System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length); 

// Please continue... 

質問:機密データが来たときに(すなわちchar[]を使用して)は、感覚(上記の特別ポイント)を作るんもともとString値としてあなたに?例:

char[] passwd = passwordProvider.getKeyStorePassword().toCharArray(); 
KeyStore keystore = KeyStore.getInstance("JKS"); 

// TODO: using the passwd, load the keystore; 

System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length); 

// Please continue... 

ありがとうございます。

UPDATE2:この特定の状況(将来の変更やその他のことについては忘れてしまいます)では、「char配列の内容をクリアしていますか?

UPDATE1:それはWhy is char[] preferred over String for passwords?のコピーではありません 私は物語が何であるか知っています。私はこの特定の文脈で尋ねています、それはまだ意味がありますか?

+2

[パスワードが文字列よりもchar \ [\]が優先されるのはなぜですか?](http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-st-for-passwords) – Nilesh

+0

私はそれがある意味があると思う。より多くのセキュリティシールドを持つ方がよいでしょう。また、異なるパスワードプロバイダに切り替えると、コードを変更する必要がなくなります。 – yeputons

+0

あなたはそうです。しかし、私はこの特定の文脈で意味があるかどうかを学びたいと思っていましたが、その答えはノーではありません。 – Rad

答えて

4

Stringを返すのは、パスワードプロバイダのAPIの設計上のセキュリティ上の問題です。

しかし、あなたはそのAPIと仕事に持って場合、char[]に変換することがすぐにあなたがもはやのためにそれへの参照を保持していないので、あなたが、GC'dあることからStringインスタンスを防止していないことを意味し絶対に必要以上に。

ここでは「悪化していない」ためchar[]を使用するのが理にかなっています。

+0

私はすぐに 'char []'に変換することを学びたいと思っています。最初に 'getKeyStorePassword'メソッドの結果を' String'変数に格納してから 'char []'に変換すると、低レベルで何かが変更されますか?私が理解していることから、それは違うはずがありません。そうですか? – Rad

+0

@Radが 'a.b().c()'を呼び出すと、スタックに 'a.b()'の結果が格納され、その上で 'c()'が呼び出されます。これは基本的に変数に入れることと同じです。ポイントは、その中間結果を含む明示的な変数がある場合、意図的にまたは他の方法でリークを引き起こすものを実行できることです。あなたは勤勉で慎重にコードを精査して、これが起こらないことを確認したり、最初に変数を作成しないことで、漏れが発生しないようにすることができます。 –

+0

もちろん、あなたがそれをゼロにする前に 'char []'から別の 'String'をビルドするのを止めるものはありません。 –