Как можно безопасно прочитать пароль с консоли в Java, перенаправляя стандартный вывод? - PullRequest
0 голосов
/ 30 апреля 2019

Я использую этот довольно простой код для чтения пароля из консоли:

String s = new String(System.console().readPassword("Enter password:"));

Когда я запускаю это из команды примерно так:

$ java Foo
Enter password:

Все хорошо. Но если я перенаправлю стандартный вывод, я получу:

$ java Foo > /dev/null
Exception in thread "main" java.lang.NullPointerException
  at Foo.main(Foo.java:122)

(строка 122 - та, что показана выше)

Странно, что перенаправление stdout должно убить консоль, но я могу понять, почему это может происходить.

Вместо того, чтобы получить NPE, я бы хотел обойти это каким-то образом, но я не уверен, что в Java есть какие-либо другие средства, которые позволяют считывать чувствительные значения с клавиатуры, не отображая символы.

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

1 Ответ

0 голосов
/ 30 апреля 2019

Я не знаю, является ли это тем, что вам нужно, но, если возможно, вы можете загрузить пароль с консоли, как вы это делали в начале приложения, а затем программно перенаправить системный вывод в никуда для остальной части исполнение

System.setOut(new PrintStream(new OutputStream() {
                // don't write to nowhere
                public void write(int b) { }
            }));

и в JDK11 вы можете сделать

System.setOut(new PrintStream(OutputStream.nullOutputStream()));
...