Java 编程语言中的口令屏蔽
Java 编程语言中的口令屏蔽作者:Qusay H. Mahmoud 目前,对于 Java 命令行基于文本的输入/输出 API 的批评之一就是它缺乏对命令行输入口令屏蔽的支持。如果借助 AWT/Swing,这便不再成为问题,因为 AWT/Swing 提供了可以提供屏蔽口令的方法。 2002 年 9 月,我发表了本文的早期版本,其后便不断收到大量感谢信、建设性的意见和在应用程序中使用源代码的许可。本文:
口令屏蔽登录屏幕和登录对话框使用口令屏蔽技术,这种技术要么在输入口令时隐藏口令,要么显示一个字符(比如星号'*')来代替用户输入的字符。例如,当您在一台 Windows 机器上进行登录时,一个登录对话框将会呈现在您眼前,其中的口令一栏使用星号作为屏蔽或回显字符。 如果操作系统是 UNIX,则登录屏幕中的口令栏不显示回显字符。它的做法很简单,就是什么都不显示,如图 1 所示。 AWT/Swing 中的口令屏蔽如果您希望为您的应用程序提供图形化的登录对话框,您可以使用 AWT 的 基于所使用字体的平均字符宽度,数字8指定了文本栏的宽度。您可以把回显字符设置为任何您喜欢的字符。注意,如果您把它设置为0,这意味着输入将会被回显,而不会被屏蔽。 在 Swing 中,您可以使用 命令行输入屏蔽和 AWT/Swing 不同,在 Java 中没有特殊的 API 可用于屏蔽命令行输入。这也是许多开发人员一直所要求的一项功能。如果您希望为命令行基于文本的 Java 应用程序以及服务器端 Java 应用程序提供一个登录屏幕,它就很有用。提供这种功能的一种方式就是使用 Java 本地接口(Java Native Interface ,JNI)。对于不了解 C/C++ 或者希望坚持 100% 纯 Java 代码的某些 Java 开发人员来说,这可能有一定难度。 这里我针对这个问题提出一个解决方案。在本文的早期版本中,所使用的是一个 UNIX 风格的登录屏幕,口令根本不在屏幕上回显。这样做的具体方法是,让一个单独的线程通过重写和打印口令提示命令行,尝试擦除回显到控制台的字符。大家仍然可以从论坛下载该篇文章中专用的代码和改进后的代码。 然而,大家最需要的功能之一是使用星号"*"替换回显的字符。因此,本文从为口令屏蔽提供一个简单的解决方案开始,接着给出改进后的、更加可靠和安全的代码。 简单的解决方案这个解决方案使用一个单独的线程,在输入回显字符的时候擦除它们,然后使用星号代替它们。这是使用 代码示例 1:EraserThread.java
代码示例 2:PasswordField.java 作为如何使用 代码示例 3:TestApp.java 如果您在 Windows、MacOS 或 UNIX 操作系统上运行 使代码安全而可靠上述的简单解决方案有一个主要缺陷:不应该使用字符串来存储诸如口令这类敏感信息!在本文的余下部分中,将会给出一个经过改进的解决方案。 然而,首先,
代码示例 4 显示了修订后的 代码示例 4:MaskingThread.java 尽管使用 代码示例 5:PasswordField.java 最后, 代码示例 6:PasswordApp.java 如果您在 Windows、MacOS 或 UNIX 操作系统上运行 结束语本文概览了在 Java 中进行口令屏蔽的方法,演示了在 AWT/Swing 应用程序中实现口令屏蔽是多么容易,并且为命令行基于文本的口令屏蔽提供了一个可重用的纯 Java 解决方案。 您可以在您的应用程序中自由地重用、改进和改编本文中的代码。您可以通过添加口令约束的方法来增强它。作为一次练习,您可能希望增强所给出的代码,以便口令的长度能够确定,而且口令中不允许使用某些字符,比如空格。 更多信息
致谢 |
图 1:UNIX 登录屏幕 |