java Как прочитать пароль из консоли без использования System.console()?



security passwords (4)

Я столкнулся с этой ошибкой затмения , когда System.console() недоступен для запуска приложений Java. У меня есть небольшое приложение Java, которое также требует ввода пароля, который запускается только из среды IDE. Есть ли другой способ безопасно прочитать пароль (т.е. не отображать его на консоли) с консоли, используя только классы JDK?

РЕДАКТИРОВАТЬ:
Я знаю System.in , но он отображает введенные символы в консоли и поэтому небезопасен.

EDIT2:
Также хочу отметить, что в проекте можно создать командный файл под windows или небольшой скрипт bash под linux / unix. Открыв этот файл в eclipse с помощью системного редактора по умолчанию, он будет запущен в новом окне консоли, где доступен System.console() . Таким образом, вы можете запустить приложение из затмения. но проект должен быть построен первым, чтобы существовали двоичные файлы.


Я столкнулся с той же проблемой. (Уважаемое сообщество Eclipse: неужели так сложно исправить эту ошибку?) Как и всем остальным, мне нужна IDE для разработки / отладки и автономная работа.

Итак, я написал этот метод:

private static String readPwd() throws IOException {
    Console c=System.console();
    if (c==null) { //IN ECLIPSE IDE
        System.out.print("Password: ");
        InputStream in=System.in;
        int max=50;
        byte[] b=new byte[max];

        int l= in.read(b);
        l--;//last character is \n
        if (l>0) {
            byte[] e=new byte[l];
            System.arraycopy(b,0, e, 0, l);
            return new String(e);
        } else {
            return null;
        }
    } else { //Outside Eclipse IDE
        return new String(c.readPassword("Password: "));
    }
}

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


Возможно, вместо консоли попробуйте использовать диалог с JPasswordField . Вот пример из http://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));

Подобно ответу @Pshemo, можно вернуться к Swing:

final String passwd;
final String message = "Enter password";
if( System.console() == null ) { 
  final JPasswordField pf = new JPasswordField(); 
  passwd = JOptionPane.showConfirmDialog( null, pf, message, 
    JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE ) == JOptionPane.OK_OPTION 
      ? new String( pf.getPassword() ) : ""; 
} else 
  passwd = new String( System.console().readPassword( "%s> ", message ) );

Если System.console() возвращает значение null , это означает, что для Java нет доступной консоли.

  • Вы не можете использовать System.in потому что есть вероятность, что он не подключен к консоли.

  • Даже если бы вы могли, в Java нет переносимого способа отключения эха.

  • Возможно, вы сможете использовать Swing (или что-то еще), чтобы открыть окно для запроса пароля, но если система безголовая, это не сработает.

Если вы готовы делать непереносимые вещи, то (в Linux / UNIX) вы можете попробовать открыть «/ dev / console» или «/ dev / tty». И тогда вы можете использовать termios, чтобы перевести драйвер tty в режим noecho. Но вам нужно сделать хотя бы часть этого в нативном коде.





passwords