Как замаскировать пароли в Java-программе командной строки звездочками или чем-то подобным? - PullRequest
0 голосов
/ 08 января 2019

Стандартный метод JVM для чтения пароля из командной строки без его отображения - java.io.Console.readPassword(). Это, однако, ничего не показывает, пока пользователь печатает; пользователи, привыкшие к графическим программам, будут ожидать, что символы, такие как «•» или «*», появятся вместо символов, которые они вводят. Естественно, они также захотят, чтобы возврат, вставка и т. Д. Работали в обычном режиме, просто заменяя все символы на один и тот же символ.

В 2019 году существует ли общепринятая процедура JVM для отображения «*******», когда пользователь вводит «hunter2» в консольном приложении? Может ли это быть сделано без графического интерфейса? Вопрос 2011 года по теме получил ответ со ссылкой на эту статью по теме; можем ли мы добиться большего успеха сегодня, чем показанное в нем довольно сложное решение?

(Я использую Kotlin в качестве своего предпочтительного языка, поэтому решение, специфичное для Kotlin, удовлетворит его, если таковое будет.)

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я думаю, что ответ на ваш вопрос можно найти здесь, в самом stackoverflow. пожалуйста, посмотрите это:

маскировка-пароль вход-из-консоли-Java

пример кода оттуда:

import java.io.Console;
public class Main {

    public void passwordExample() {        
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        console.printf("Testing password%n");
        char passwordArray[] = console.readPassword("Enter your secret password: ");
        console.printf("Password entered was: %s%n", new String(passwordArray));

    }

    public static void main(String[] args) {
        new Main().passwordExample();
    }
}

надеюсь, что это полезно. :)

0 голосов
/ 08 января 2019

hunter2? Вот это да. Ссылка подтверждена.

Легкого пути нет. Основная проблема заключается в том, что стандарт System.in вообще не дает никаких символов, пока пользователь не нажмет клавишу ввода, поэтому нет способа эмулировать его (если вы попытаетесь прочитать char-for-char из System.in и выполнить команду emit a * каждый раз, когда нажимается клавиша, это не будет работать).

Библиотека лантерна в https://github.com/mabe02/lanterna может это сделать. Если вы хотите подражать этому, это .. очень сложно. Он имеет разветвленные пути кода для Unix и Windows. Например, в Unix он использует некоторые хакеры, чтобы выяснить, на каком tty вы находитесь, а затем открывает нужное устройство / dev / tty. С лантерной написать это самостоятельно было бы тривиально.

Это так, или принимайте пустое пустое значение Console.readPassword (), правда. Или напишите веб-интерфейс или графический интерфейс Swing / AWT / javafx.

...