Вы вполне можете услышать такой вопрос на интервью на позицию Java Junior. Но вот моему приятелю его задали на собеседовании на должность Technical Lead.
Любой, у кого есть доступ к дампу памяти, может найти пароль в текстовом виде, и это — серьезная причина, чтобы использовать зашифрованный пароль, а не простой текст.
Поскольку строки являются неизменными, их содержимое нельзя изменить. Любое изменение приведет к созданию новой строки. А вот в случае с
И
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
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ