如何在Java命令行程序中掩盖密码并用星号或类似符号代替?

6
标准JVM方法用于在不显示密码的情况下从命令行读取密码是java.io.Console.readPassword()。然而,当用户输入时不会显示任何内容;习惯于图形程序的用户将期望出现代替他们键入字符的符号,例如“•”或“*”。自然地,他们还希望退格,插入等正常工作,只是所有操作的字符都被替换为相同的符号。
2019年,在控制台应用程序中,是否有一种通常接受的JVM过程可以在用户键入“hunter2”时显示“*******”?即使没有GUI,这是否可以正确完成?关于此主题的2011 SO问题得到了一个答案,链接到此文章;现在我们能否比所示的相当复杂的解决方案做得更好?
(我碰巧使用Kotlin作为我的首选语言,因此如果有Kotlin特定的解决方案,它将得到满足。)
2个回答

0

hunter2?哇。已确认参考。

没有简单的方法。主要问题是标准的System.in在用户按下回车之前不会给你任何字符,因此无法模拟它(如果您尝试从System.in逐个字符地读取并在每次按键时发出*,那是行不通的)。

然而,https://github.com/mabe02/lanterna的lanterna库可以做到。如果您想要模拟它,这非常复杂。它有分支代码路径用于unix和windows。例如,在unix上,它使用一些技巧来确定您正在使用的tty,然后打开正确的/dev/tty设备。使用lanterna,编写这个程序将变得轻而易举。

除此之外,就只能接受Console.readPassword()的空白无物了。或者,编写一个Web界面或swing/awt/javafx GUI。


-1

我认为你的问题的答案可以在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();
    }
}

希望这对你有所帮助。 :)

字符串 "Enter your secret password: " 只是提供一个提示,它不会设置 readPassword() 来显示占位符字符。 - Shay Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接