JavaRush /Java блог /Java Developer /Вопрос-ответ: почему пароль в Java лучше хранить в массив...

Вопрос-ответ: почему пароль в Java лучше хранить в массиве символов, а не в String?

Статья из группы Java Developer
Вы вполне можете услышать такой вопрос на интервью на позицию Java Junior. Но вот моему приятелю его задали на собеседовании на должность Technical Lead.
Вопрос-ответ: почему пароль в Java лучше хранить в массиве символов, а не в String?  - 1
И String, и массив символов можно использовать для хранения текстовых данных. Но осознанный выбор одного или другого для конкретной задачи — сложен, если вы ещё не сталкивались с подобной ситуацией. Однако, как заметил мой друг, любой вопрос, связанный с String, обычно связан с таким особенным свойством строк, как неизменяемость (Immutable), и он воспользовался этим на собеседовании. Итак, давайте разберём пару причин, почему для хранения пароля нужно использовать char [], а не String.

Причина 1. Строки — неизменны

Так как строки в Java являются неизменными, то ваш пароль в виде обычного текста будет доступен в памяти, пока сборщик мусора не очистит её. И поскольку String используются в String pool для повторного использования, существует довольно высокая вероятность того, что пароль останется в памяти надолго, что совсем не безопасно.
Java String pool — это пул или набор объектов (строк), который расположен в специальном месте — куче (Heap). String в Java — один из самых распространённых типов данных. Это не примитивный тип, а объект, поскольку весьма ресурсозатратен. Так, для хранения строки из четырёх символов необходимо выделить 56 байт памяти. Вот почему строки, как и другие объекты, хранятся в куче.
Любой, у кого есть доступ к дампу памяти, может найти пароль в текстовом виде, и это — серьезная причина, чтобы использовать зашифрованный пароль, а не простой текст. Поскольку строки являются неизменными, их содержимое нельзя изменить. Любое изменение приведет к созданию новой строки. А вот в случае с char [], вы можете заменить любой его элемент нулем или пустым символом. Таким образом, хранение пароля в массиве символов явно снижает риск перехвата пароля.

Причина 2. Рекомендации авторов

Java сама по себе (ну, через своих создателей, разумеется) рекомендует использовать метод getPassword () из класса JPasswordField, который возвращает char []. Можно также попробовать устаревший (deprecated) метод getText (). Почему бы не последовать рекомендациям авторов языка?

Причина 3. Печать

С типом String всегда существует опасность того, что текст, хранящийся в строке будет напечатан в файле логов или в консоли. В то же время в случае использования Array, вы не будете печатать содержимое массива, а только его расположение в памяти. Конечно, это не то чтобы серьезная причина, но всё-таки в этом тоже есть смысл.

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
Разумеется, использование char [] для хранения паролей в Java само по себе не является панацеей. Вам нужно озаботится о безопасности, например, работать с хэшами и шифровать пароли, а не хранить их в текстовом виде. И, конечно, удалять его из памяти сразу после процедуры аутентификации. По материалам Javarevisited
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дмитрий Н Уровень 36
10 января 2018
В примере ошибочка же? Вывод будет String password: Неизвестно
Евгений Иванов Уровень 39
10 января 2018
"Пароль персонажа" 10 гугл-транслейтов из 10