20

私はこの日食のバグSystem.console()遭遇しました。Javaアプリケーションの起動には利用できません。IDE内からのみ起動するパスワードの入力も必要な小さなJavaアプリがあります。JDKクラスのみを使用して、コンソールからパスワードを安全に読み取る(コンソールに表示しないことを意味する)他の方法はありますか?

編集:
私は知ってSystem.inいますが、それはコンソールに入力された文字を表示しているため、安全ではありません。

EDIT2:
プロジェクトのWindowsでバッチファイルを作成したり、linux/unixで小さなbashスクリプトを作成したりできることにも注意してください。このファイルをシステムデフォルトエディタを使用してEclipseで開くと、使用可能な新しいコンソールウィンドウで開始されSystem.console()ます。このようにして、Eclipse内からアプリケーションを起動できます。ただし、バイナリが存在するように、プロジェクトを最初にビルドする必要があります。

4

4 に答える 4

5

おそらく、コンソールの代わりに、ダイアログを使用してみてくださいJPasswordFieldhttp://blogger.ziesemer.com/2007/03/java-password-dialog.htmlの例を次に示します。

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));
于 2013-03-01T14:40:00.690 に答える
3

System.console()が返される場合null、Java に関する限り、使用可能なコンソールがないことを意味します。

  • System.inコンソールに接続されていない可能性があるため、使用できません。

  • できたとしても、Java でエコーをオフにする移植可能な方法はありません。

  • Swing (またはその他のもの) を使用してウィンドウをポップアップさせてパスワードを要求できる場合もありますが、システムがヘッドレスの場合は機能しません。


移植性のないことを行う準備ができている場合は、(Linux / UNIX で) "/dev/console" または "/dev/tty" を開いてみることができます。そして、termios を使用して tty ドライバーを noecho モードにすることができます。ただし、少なくとも一部はネイティブ コードで行う必要があります。

于 2013-03-01T15:06:46.847 に答える