2017-02-03 12 views
6

Wiemy już o tej sugestii/praktyce użycia char[] zamiast String dla wrażliwych danych. Istnieje wiele powodów. Jednym z nich jest, aby oczyścić wrażliwą prawo danych po nie są one już potrzebne: Czułe dane Java: char [] vs String? O co chodzi?

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

Teraz pytanie: czy (tj użyciu char[]) sensu (szczególnie punkt wyżej), gdy dane wrażliwe przychodzi pierwotnie jako wartość String? na przykład:

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

Z góry dziękuję.

UPDATE2: Przeformułuję pytanie: w tym konkretnym kontekście (zapomnij o zmianach w przyszłości lub cokolwiek innego), czy wiersz "czyszczenie zawartości tablicy znaków" przynosi jakieś korzyści?

UPDATE1: nie jest to duplikacja Why is char[] preferred over String for passwords? Wiem, co to za historia. Pytam w tym konkretnym kontekście, czy to wciąż ma sens?

+2

Prawdopodobny duplikat [Dlaczego char \ [\] preferowane przez String dla haseł?] (Http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string- for-passwords) – Nilesh

+0

Myślę, że to ma jakiś sens. Lepiej mieć więcej osłon bezpieczeństwa. Zapewni to również, że jeśli kiedykolwiek zmienisz dostawcę haseł, nie musisz zmieniać kodu. – yeputons

+0

Masz rację. Ale chciałem się dowiedzieć, czy ma to sens w tym konkretnym kontekście, na który odpowiedź brzmi "nie", niewiele. – Rad

Odpowiedz

4

Wydaje mi się, że jest to problem z bezpieczeństwem w projektowaniu interfejsu API dostawcy haseł, który zwraca String.

Ale jeśli trzeba pracy z tym API, konwersja do char[] natychmiast oznacza, że ​​nie uniemożliwiają wystąpienie String z bycia GC'd, ponieważ nie jesteś posiadających odniesienie do niej na dłużej niż jest to absolutnie konieczne.

Dlatego warto używać tutaj char[], ponieważ "nie pogarszasz".

+0

Jesteśmy blisko tego, czego chciałbym się nauczyć: konwersję na "char []" natychmiast. Czy zmienia wszystko na niskim poziomie, jeśli najpierw przechowuję wynik metody 'getKeyStorePassword' w zmiennej' String', a następnie konwertuję ją 'char []'. Z tego, co rozumiem, nie powinno być inaczej. Czy to jest poprawne? (Załóżmy, że nigdzie nie ma żadnych zmian) – Rad

+0

@Rad wywołujący 'a.b(). C()' zapisuje wynik 'a.b()' na stosie, a następnie wywołuje 'c()' na tym. Jest to zasadniczo takie samo, jak umieszczenie go w zmiennej. Chodzi o to, że jeśli posiadasz wyraźną zmienną zawierającą ten wynik pośredni, możesz - celowo lub w inny sposób - zrobić coś, co spowoduje wyciek. Możesz być sumienny i dokładnie analizować swój kod, aby to nie nastąpiło, lub po prostu nie tworzyć zmiennej w pierwszej kolejności, co nie pozwala na wystąpienie wycieku. –

+0

Oczywiście, nic nie powstrzyma cię od zbudowania innego 'String'a z' char [] 'zanim go wyzerujesz ... –

Powiązane problemy