JavaRush /Blog Java /Random-PL /Pytania i odpowiedzi: Dlaczego lepiej jest przechowywać h...

Pytania i odpowiedzi: Dlaczego lepiej jest przechowywać hasło w Javie w tablicy znaków niż w ciągu znaków?

Opublikowano w grupie Random-PL
Takie pytanie możesz usłyszeć podczas rozmowy kwalifikacyjnej na stanowisko Java Junior. Ale mojego znajomego zapytano o to podczas rozmowy kwalifikacyjnej na stanowisko Lidera Technicznego.
Pytania i odpowiedzi: Dlaczego lepiej jest przechowywać hasło w Javie w tablicy znaków niż w ciągu znaków?  - 1
Do przechowywania danych tekstowych można używać zarówno String, jak i tablicy znaków. Ale świadomy wybór jednego lub drugiego do konkretnego zadania jest trudny, jeśli nie spotkałeś się jeszcze z podobną sytuacją. Jednakże, jak zauważył mój przyjaciel, wszelkie pytania związane z String, zwykle wiążą się ze specjalną właściwością ciągów znaków zwaną niezmiennością ( Immutable), i wykorzystał to w wywiadzie. Przyjrzyjmy się więc kilku powodom, dla których powinieneś używać char [], a nie , do przechowywania hasła String.

Powód 1. Ciągi są niezmienne

Ponieważ w Javie ciągi znaków są niezmienne, hasło w postaci zwykłego tekstu będzie dostępne w pamięci do czasu wyczyszczenia go przez moduł zbierający elementy bezużyteczne. A ponieważ Stringsą one wykorzystywane String pooldo ponownego użycia, istnieje dość duże prawdopodobieństwo, że hasło pozostanie w pamięci przez długi czas, co wcale nie jest bezpieczne.
Pula ciągów Java to pula lub zbiór obiektów (ciągów znaków) umieszczony w specjalnym miejscu – stercie. String w Javie to jeden z najpopularniejszych typów danych. Nie jest to typ prymitywny, ale obiekt, ponieważ wymaga dużej ilości zasobów. Aby więc zapisać ciąg czterech znaków, należy przydzielić 56 bajtów pamięci. Dlatego ciągi znaków, podobnie jak inne obiekty, są przechowywane na stercie.
Każdy, kto ma dostęp do zrzutu pamięci, może znaleźć hasło w postaci zwykłego tekstu, co jest dobrym powodem, aby używać zaszyfrowanego hasła, a nie zwykłego tekstu. Ponieważ ciągi znaków są niezmienne, ich zawartości nie można zmienić. Każda zmiana spowoduje utworzenie nowej linii. Ale w przypadku char []możesz zastąpić dowolny jego element zerem lub pustym znakiem. Zatem przechowywanie hasła w tablicy znaków wyraźnie zmniejsza ryzyko przechwycenia hasła.

Powód 2. Zalecenia autorów

Sama Java (no cóż, oczywiście poprzez swoich twórców) zaleca użycie metody getPassword ()z klasy JPasswordField, która zwraca char []. Możesz także wypróbować przestarzałą metodę getText (). Dlaczego nie zastosować się do zaleceń autorów języka?

Powód 3. Drukuj

W przypadku typu Stringzawsze istnieje niebezpieczeństwo, że tekst przechowywany w ciągu zostanie wydrukowany w pliku dziennika lub w konsoli. Jednocześnie, jeśli użyjesz Array, nie wydrukujesz zawartości tablicy, a jedynie jej lokalizację w pamięci. Oczywiście nie jest to do końca poważny powód, ale nadal ma to sens.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
Oczywiście char []samo użycie języka Java do przechowywania haseł nie jest panaceum. Musisz zadbać o bezpieczeństwo, na przykład pracując z skrótami i szyfrując hasła, zamiast przechowywać je w postaci zwykłego tekstu. I oczywiście usuń go z pamięci natychmiast po zakończeniu procedury uwierzytelniania. Na podstawie materiałów z Javarevisited
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION