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.
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ż
String
są one wykorzystywane
String pool
do 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
String
zawsze 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
GO TO FULL VERSION