Почему мы читаем пароль с консоли в массиве 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[]
..
Может ли кто-нибудь пролить свет в этом вопросе?
Ответы
Ответ 1
Как вы сказали, строки неизменяемы, что означает, что, как только вы создали строку, если другой процесс может сбрасывать память, нет способа (ок, может с отражением) вы можете избавиться от данных до того, как GC начнет работать.
С помощью массива вы можете явно стереть данные после того, как вы закончите с ним: вы можете перезаписать массив любым чем угодно, и пароль не будет присутствовать нигде в системе, даже до сбора мусора.
Ответ 2
Из Javadoc java.io.Console:
Примечание по безопасности. Если приложение должно читать пароль или другие защищенные данные, он должен использовать readPassword()
или readPassword(String, Object...)
и вручную ноль возвращаемый массив символов после обработки, чтобы минимизировать время жизни конфиденциальных данных в памяти.
Это просто для предотвращения доступа других приложений (например, кейлоггеров и т.д.).
И кроме того, если вы используете String
, так как они неизменяемы, их изменение создаст копии в памяти. Использование char[]
спасет вас в этом случае. Поскольку они изменяемы, они не будут создавать копии, и вы можете сделать их нулевыми после обработки.
Ответ 3
Поскольку строки неизменяемы, они не могут быть перезаписаны и остаются в памяти, пока приложение активно. С другой стороны, массив char
можно очистить от всех сведений о пароле.
Ответ 4
Я считаю, что вы можете очистить их из памяти, перезаписав их, когда они вам больше не нужны. С Java, по крайней мере, если вы используете String, тогда в памяти могут быть копии, оставшиеся в памяти.
Если вы перезаписываете массив char с помощью цикла for и устанавливаете каждое значение в 0, я не думаю, что в памяти останутся оставшиеся копии.