System.console() 是 Java 中用于安全读取密码的终端交互工具,仅在真实终端环境中非 null,需判空后调用 readPassword() 获取 char[] 并及时清零,避免转为 String。

System.console() 是 Java 提供的、用于与底层终端直接交互的工具类,它在支持的环境(如 Linux/macOS 终端、Windows 的 CMD/PowerShell)下能安全读取密码——即输入时不显示字符(星号或完全隐藏),且不被命令行历史记录捕获。
前提:确保运行环境支持 Console
Console 对象仅在 JVM 以“连接到真实终端”的方式启动时才非 null。常见不支持的情况包括:
- IDE 内置终端(如 IntelliJ 或 Eclipse 的 Run Console)通常返回 null
- 通过重定向标准输入启动(如
java MyApp ) - 某些容器或 CI 环境未分配伪终端(pty)
使用前务必判空:
Console console = System.console();
if (console == null) {
throw new RuntimeException("No console available — run from terminal");
}
读取密码:用 readPassword() 而非 readLine()
readPassword() 是专为密码设计的方法,它:
- 禁用回显(终端光标不动,输入无可见反馈)
- 返回
char[]而非String,便于手动清零内存,降低敏感信息驻留风险 - 自动处理换行符截断,不包含
\n或\r
示例用法:
Console console = System.console();
char[] password = console.readPassword("Enter password: ");
// 使用后立即清空
if (password != null) {
Arrays.fill(password, '\0');
}
注意字符数组的安全使用习惯
不要将 char[] 转成 String 存储或日志输出,避免字符串常量池或 GC 延迟导致残留。如需校验,直接在 char 数组上操作:
// ✅ 安全比对(避免 String.equals) boolean matches = Arrays.equals(password, expectedPassword); // ❌ 避免 String pwdStr = new String(password); // 创建不可变 String,可能长期驻留堆中
替代方案(当 Console 不可用时)
若 System.console() == null,可降级为带提示的 Scanner(有回显,仅作调试/开发环境兜底),但需明确告知用户安全性限制:
if (console == null) {
System.err.println("Warning: no secure console — password will be visible.");
Scanner scanner = new Scanner(System.in);
System.out.print("Enter password (visible): ");
String fallback = scanner.nextLine();
return fallback.toCharArray();
}

















