Подтвердить что ты не робот

Почему мы читаем пароль с консоли в массиве char вместо строки

Возможный дубликат:
Почему char [] предпочитает строку для паролей?

Когда я готовился к OCPJP, я перешел к теме - "Чтение ввода пользователя с консоли".

Был пример, где он читал username в String ссылке, тогда как password в массиве char[], но я не мог понять, почему он использовал массив char. Вот код: -

Console console = System.console();

String username = console.readLine("User Name? ");
char[] password = console.readPassword("Password? "); 

Это вызвало у меня сомнения. Почему мы не использовали ссылку String для хранения пароля. Поскольку Strings неизменяемы,, поэтому он должен быть более безопасным для чтения пароля в String, поскольку его содержимое не может быть изменено в этом отношении.

Итак, что все в чтении password в массиве char[]..

Может ли кто-нибудь пролить свет в этом вопросе?

4b9b3361

Ответ 1

Как вы сказали, строки неизменяемы, что означает, что, как только вы создали строку, если другой процесс может сбрасывать память, нет способа (ок, может с отражением) вы можете избавиться от данных до того, как GC начнет работать.

С помощью массива вы можете явно стереть данные после того, как вы закончите с ним: вы можете перезаписать массив любым чем угодно, и пароль не будет присутствовать нигде в системе, даже до сбора мусора.

Ответ 2

Из Javadoc java.io.Console:

Примечание по безопасности. Если приложение должно читать пароль или другие защищенные данные, он должен использовать readPassword() или readPassword(String, Object...) и вручную ноль возвращаемый массив символов после обработки, чтобы минимизировать время жизни конфиденциальных данных в памяти.

Это просто для предотвращения доступа других приложений (например, кейлоггеров и т.д.).

И кроме того, если вы используете String, так как они неизменяемы, их изменение создаст копии в памяти. Использование char[] спасет вас в этом случае. Поскольку они изменяемы, они не будут создавать копии, и вы можете сделать их нулевыми после обработки.

Ответ 3

Поскольку строки неизменяемы, они не могут быть перезаписаны и остаются в памяти, пока приложение активно. С другой стороны, массив char можно очистить от всех сведений о пароле.

Ответ 4

Я считаю, что вы можете очистить их из памяти, перезаписав их, когда они вам больше не нужны. С Java, по крайней мере, если вы используете String, тогда в памяти могут быть копии, оставшиеся в памяти.

Если вы перезаписываете массив char с помощью цикла for и устанавливаете каждое значение в 0, я не думаю, что в памяти останутся оставшиеся копии.