2017-02-03 10 views
6

Bu öneriyi/uygulamayı, hassas veriler için String yerine char[] kullanmak için zaten biliyoruz. Bunun için birden çok nedeni var. ŞimdiJava'ye duyarlı veriler: char [] vs String? Amaç ne?

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... 

soru: o (özellikle yukarıda bahsedilen nokta), hassas veriler geldiğinde mantıklı (yani char[] kullanarak) yok artık gerekli değildir ardına hassas veri sağı toparlamak için Orijinal olarak String değeri olarak? peşin

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... 

teşekkür: örneğin.

UPDATE2: Soruyu şu şekilde yeniden yazacağım: bu özel bağlamda (gelecekteki veya başka bir şeydeki değişiklikleri unutun), "char dizisinin içeriğini temizle" satırı herhangi bir fayda sağlıyor mu?

UPDATE1: Why is char[] preferred over String for passwords? 'un bir kopyası değil. Hikayenin ne olduğunu biliyorum. Bu özel bağlamda soruyorum, hala mantıklı mı?

+2

Olası çoğaltılamaz [Parolalar için dize üzerinden neden char \ [\] tercih edilir?] (Http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords) – Nilesh

+0

Sanırım biraz mantıklı. Daha fazla güvenlik kalkanına sahip olmak daha iyidir. Ayrıca, farklı şifre sağlayıcısına geçiş yaparsanız, kodunuzu değiştirmeniz gerekmez. – yeputons

+0

Haklısınız. Ama bu özel bağlamda, cevabın hayır olduğu, mantıklı olup olmadığını öğrenmek istedim. – Rad

cevap

4

Bana öyle geliyor ki, şifre sağlayıcısı API'sinin tasarımında bir güvenlik problemi var, bir String döndürüyor. Eğer char[] dönüştürmek o API ile çalışmaları zorunda eğer

Ama hemen artık için ona bir referansa sahip değiliz, çünkü GC'd olmaktan String örneği önlenmesi anlamına gelir kesinlikle gerekli olandan.

Bu nedenle, char[]'u kullanmanız mantıklıdır çünkü "daha kötüsünü yapmıyorsunuz".

+0

Öğrenmek istediğim şeye yakınız: hemen 'char [] 'a çevirmek. Bir 'String' değişkeninde' getKeyStorePassword' yönteminin sonucunu ilk önce sakladım ve daha sonra 'char []' 'a dönüştürebilirim. Anladığım kadarıyla farklı bir şey yapmamalı. Doğru mu? (Herhangi bir zamanda herhangi bir değişiklik yapılmasına izin verilmediğini varsayalım) – Rad

+0

@Rad'i çağırmak 'a.b(). C()', “a.b()” sonucunu yığında saklar ve daha sonra 'c()' yi çağırır. Bu temelde bir değişkene koymakla aynı şeydir. Önemli olan, bu ara sonucu içeren açık bir değişkeniniz varsa, kasıtlı olarak veya başka bir şekilde, sızıntıya neden olacak bir şey yapabilmenizdir. Bunun gerçekleşmediğinden emin olmak için dikkatli olabilir ve dikkatlice inceleyebilir ya da ilk başta değişken oluşturamazsınız, böylece sızıntının oluşmasına izin vermezsiniz. –

+0

Elbette, hiçbir şey onu sıfırlamadan önce "char []" dan başka bir "String" oluşturmayı durdurur ... –

İlgili konular