Answers:
因为这就是我们在* nix土地上做事的方式。:) 通过不显示星号来提供一点额外的安全性。这样,看到您的屏幕的人就看不到您的密码长度。
但我必须承认,输入密码时,如果没有任何反馈,尤其是键盘输入不正确的情况,这有点令人恐惧。因此,* nix系统上的大多数GUI密码对话框确实会为您提供某种反馈,例如,使用星号或更常见的是⬤。甚至在您键入每个字符时都会显示每个字符,然后立即将其替换为a *
或replace,但是如果有人看着您的肩膀,那就不好了。或者,如果他们的设备可以拾取和解码从计算机发送到显示器的视频信号。
stty -echo
隐藏用户输入的最简单方法是什么?
没有显示!
在输入密码时隐藏密码是一种古老的传统。在大多数情况下,从安全角度讲,这是有道理的:如果有人在您的肩膀上望着,您不想让您轻松查看输入内容。(一些现代安全准则,例如1 2 3 4 5确实建议您选择使密码可见,因为这使用户能够选择更复杂的密码,并确信他们不会花时间修复看不见的东西。错别字。最大的风险不是肩膀冲浪,而是蛮力猜测,可能是离线的。)
决定应该隐藏密码后,实现者必须决定如何进行操作。终端具有显示用户输入的模式(回显打开)和未显示用户输入的模式(回显关闭)。回声关闭模式在某种程度上具有固有的存在:在该模式下,终端不执行回声用户输入的额外工作。对于键入键不会插入该字符,而是调用绑定到该键的应用程序快捷方式的应用程序,还必须存在此模式。因此,诸如passwd
在读取密码时将终端设置为回显模式的命令。
为每个字符打印星号仅需要相对较小的好处就需要额外的实现工作,而该passwd
命令的实现者并不喜欢这样做。没有用于打印星号的终端模式,因为它是非常专业的功能,仅在输入密码时有用。
顺便说一句,如果您想在更改密码时看到密码,则可以使用cat | passwd
(至少在某些系统上-某些版本的passwd
require需要一个选项,例如cat | passwd --stdin
,有些根本不接受此密码)。(您甚至可以这样做{ echo 'current password'; echo 'new password'; echo 'new password'; } | passwd
,但不要这样做:这会将密码保存在shell历史记录中,这有很大的泄露风险。)使用从终端读取密码的命令(而不是其他任何命令)来安排这样做其标准输入(例如sudo
或ssh
)更为复杂;如果您有可用的GUI,则可以使用ssh-askpass来显示输入的字符数(SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A
对于sudo;对于ssh,当您从终端调用它时很复杂)。
使密码不可见使其更安全,因为其他人看不到密码的长度。这样可以避免他人尝试从密码长度猜测密码并登录到您的帐户的风险。