重定向标准输出时如何在Java中安全地从控制台读取密码?

时间:2019-04-30 15:27:35

标签: java console-application

我正在使用此简单易懂的代码从控制台读取密码:

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中是否有其他设施允许从键盘读取敏感值而无需回显字符。 / p>

还有其他可靠的策略吗?我怀疑我是否可以使用ANSI转义将终端置于特定模式,但是我不知道Java可以提供的可靠性。

1 个答案:

答案 0 :(得分:0)

我不知道这是否是您所需要的,但是如果可能的话,您可以像在应用程序开始时一样从控制台加载密码,然后以编程方式将系统输出重定向到其他地方执行

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

在JDK11中,您可以做

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