如何在不使用 System.console() 的情况下从控制台读取密码?

2022-09-02 10:48:29

我遇到了这个日食错误,其中不适用于Java应用程序启动。我有一个小的Java应用程序,它还需要输入一个密码,该密码只能从IDE中启动。有没有其他方法可以从控制台安全地读取密码(意味着不在控制台上显示它)仅使用JDK类?System.console()

编辑:
我知道,但这是在控制台中显示输入的字符,因此不安全。System.in

编辑2:
我还想注意,可以在Windows下创建批处理文件,或者在项目中在linux / unix下创建一个小的bash脚本。通过使用系统默认编辑器在 eclipse 中打开此文件,它将在新的控制台窗口中启动(如果可用)。通过这种方式,您可以从 eclipse 中启动应用程序。但是必须首先构建项目,以便二进制文件存在。System.console()


答案 1

也许尝试使用 带有 的对话框,而不是控制台。这是 http://blogger.ziesemer.com/2007/03/java-password-dialog.html 的例子。JPasswordField

final JPasswordField jpf = new JPasswordField();
JOptionPane jop = new JOptionPane(jpf, JOptionPane.QUESTION_MESSAGE,
        JOptionPane.OK_CANCEL_OPTION);
JDialog dialog = jop.createDialog("Password:");
dialog.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentShown(ComponentEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                jpf.requestFocusInWindow();
            }
        });
    }
});
dialog.setVisible(true);
int result = (Integer) jop.getValue();
dialog.dispose();
char[] password = null;
if (result == JOptionPane.OK_OPTION) {
    password = jpf.getPassword();
}
if (password != null)
    System.out.println("your password: " + new String(password));

答案 2

如果返回 ,则表示就Java而言没有可用的控制台。System.console()null

  • 您无法使用,因为它可能未连接到主机。System.in

  • 即使可以,也没有可移植的方法可以在Java中关闭回声。

  • 您可以使用Swing(或其他任何东西)弹出一个窗口来询问密码,但如果系统是无外设的,那就不起作用了。


如果你准备做不可移植的事情,那么(在Linux / UNIX上)你可以尝试打开“/dev/console”或“/dev/tty”。然后,您可以使用 termios 将 tty 驱动程序置于 noecho 模式。但是,您至少需要在本机代码中执行其中的一些操作。