扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
2002 年 9 月,我发表了本文的早期版本,其后便不断收到大量感谢信、建设性的意见和在应用程序中使用源代码的许可。本文:
概述了口令屏蔽
描述了用于口令屏蔽的
AWT/Swing 实用程序
为命令行输入口令屏蔽问题
提供独立于平台的解决方案
为口令屏蔽提供一个改进的解决方案(可靠而安全)
口令屏蔽
登录屏幕和登录对话框使用口令屏蔽技术,这种技术要么在输入口令时隐藏口令,要么显示一个字符(比如星号'*')来代替用户输入的字符。例如,当您在一台 Windows 机器上进行登录时,一个登录对话框将会呈现在您眼前,其中的口令一栏使用星号作为屏蔽或回显字符。
如果操作系统是 UNIX,则登录屏幕中的口令栏不显示回显字符。它的做法很简单,就是什么都不显示,
AWT/Swing 中的口令屏蔽
如果您希望为您的应用程序提供图形化的登录对话框,您可以使用 AWT 的 TextField 类,该类是一个文本组件,允许编辑单行文本。为了屏蔽口令栏,要使用 setEchoChar 方法。例如,为了把回显字符设置为星号,您需要这样做:
TextField password = new TextField(8);
password.setEchoChar('*');
基于所使用字体的平均字符宽度,数字8指定了文本栏的宽度。您可以把回显字符设置为任何您喜欢的字符。注意,如果您把它设置为0,这意味着输入将会被回显,而不会被屏蔽。
在 Swing 中,您可以使用 JPasswordField,它允许编辑单行文本,视图表明正在输入内容,但是不会显示原始字符。JPasswordField 类与和 setEchoChar 一起使用的 AWT 的 TextField 是源代码兼容的。如果您使用 JPasswordField, 默认的回显字符是星号 '*', 但是您可以将其修改为任何您选定的字符。此外,如果您把回显字符设置为 0,这意味着字符将在输入时显示出来,而不会被屏蔽。图 2 显示了一个 Swing 登录对话框,其中的回显字符被设置为 #,使用的是下面的代码片断:
JPasswordField password = new JPasswordField(8);
password.setEchoChar('#');
命令行输入屏蔽
和 AWT/Swing 不同,在 Java 中没有特殊的 API 可用于屏蔽命令行输入。这也是许多开发人员一直所要求的一项功能。如果您希望为命令行基于文本的 Java 应用程序以及服务器端 Java 应用程序提供一个登录屏幕,它就很有用。提供这种功能的一种方式就是使用 Java 本地接口(Java Native Interface ,JNI)。对于不了解 C/C++ 或者希望坚持 100% 纯 Java 代码的某些 Java 开发人员来说,这可能有一定难度。
这里我针对这个问题提出一个解决方案。在本文的早期版本中,所使用的是一个 UNIX 风格的登录屏幕,口令根本不在屏幕上回显。这样做的具体方法是,让一个单独的线程通过重写和打印口令提示命令行,尝试擦除回显到控制台的字符。大家仍然可以从论坛下载该篇文章中专用的代码和改进后的代码。
然而,大家最需要的功能之一是使用星号"*"替换回显的字符。因此,本文从为口令屏蔽提供一个简单的解决方案开始,接着给出改进后的、更加可靠和安全的代码。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者