Как замаскировать пароль в Java 5?

Я пытаюсь замаскировать пароль в Java. Sun java предложила следующий способ маскировки пароля.

Маскировка пароля

Для этого используется простой способ.

public void run () {
  stop = true;
  while (stop) {
     System.out.print("\010*");
 try {
    Thread.currentThread().sleep(1);
     } catch(InterruptedException ie) {
        ie.printStackTrace();
     }
  }
}

Но у этого подхода есть несколько недостатков.

  1. Если пользователь использует клавиши со стрелками + клавиши удаления, пароль раскрывается.

  2. Если пользователь случайно нажмет 2 клавиши одновременно (чрезвычайно высокая скорость набора текста), некоторые символы не будут маскироваться.

Вы, ребята, думаете о каком-либо способе получить 100% правильную маскировку?


person Chathuranga Chandrasekara    schedule 10.07.2009    source источник


Ответы (4)


Используйте Console.readPassword().

person Bombe    schedule 10.07.2009
comment
Консоль доступна с Java 6. Наша версия 1.5 :( - person Chathuranga Chandrasekara; 10.07.2009
comment
Он вообще не поддерживает маскировку. - person Avin Shum; 11.10.2018

Теперь вы можете использовать System.console( );

Console c = System.console();
if (c == null) {
    System.err.println("No console.");
    System.exit(1);
}


char [] password = c.readPassword("Enter your password: ");
person Pierre    schedule 10.07.2009
comment
java.io.Console доступен только в Java 6. Его вопрос указывает на то, что он использует Java 5. - person piepera; 10.07.2012

Используя определенные системные вызовы (в Windows и Unix), вы можете отключить вывод символов на консоль. Это то, что делает System.console(), но это работает и в Java.

Я использую JNA для сопоставления определенного системного вызова unix и окон в частной ветке jline:

  • в unix я использую структуру termios и tcgetattr/tcsetattr
  • в Windows я использую GetConsoleMode и SetConsoleMode.

Если вам нужен пример кода, оставьте комментарий.

person dfa    schedule 10.07.2009

С JDK 6.0 у вас есть источники Java классов, включая Console: я только что проверил, и этот класс имеет только зависимости Java 5.0.

Итак, в своем проекте вы можете создать копию этого класса Console, а затем использовать метод readPassword. Я не пробовал, но должно сработать.

person Benoit Courtine    schedule 10.07.2009
comment
Не совсем так. Метод echo() является собственным методом. - person notnoop; 10.07.2009