下面是我在 Linux 中的 bash 上创建用户的过程。
$ sudo useradd Alexandra
$ sudo passwd Alexandra
Enter new UNIX password:
Enter new UNIX password:
passwd: password updated successfully
我知道出于安全目的不应显示密码,但我的意思是,为什么星号(或我输入的字符)没有出现?
答案1
隐藏用户输入的最简单方法是什么?
不显示啊!
在输入密码时隐藏密码是一个古老的传统。在大多数情况下,从安全角度来看这是有道理的:如果有人在监视您,您不想让别人轻易看到您正在输入的内容。 (一些现代安全准则,例如1 2 3 4 5不过,确实建议有一个使密码可见的选项,因为这允许用户能够选择更复杂的密码,并确信他们不会花时间修复看不见的拼写错误。最大的风险不是肩窥,而是暴力猜测,可能是离线的。)
决定隐藏密码后,实施者必须决定如何隐藏密码。终端具有显示用户输入的模式(回显打开)和不显示用户输入的模式(回显关闭)。回显关闭模式在某种程度上具有内在的存在性:在该模式下,终端不执行回显用户输入的额外工作。对于键入键不会插入该字符,而是调用绑定到该键的某些应用程序快捷方式的应用程序,也必须存在此模式。因此,passwd
在读取密码时,只需将终端设置为回显关闭模式等命令即可。
为每个字符打印星号将需要额外的实现工作,而只能获得相对较小的好处,而命令的实现者passwd
并不想这样做。没有用于打印星号的终端模式,因为它是一个非常专业的功能,仅在输入密码时才有用。
顺便说一句,如果您想在更改密码时查看密码,可以使用cat | passwd
(至少在某些系统上 - 的某些版本passwd
需要像 这样的选项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,当您从终端调用它时会很复杂)。
答案2
因为这就是我们在 *nix 土地上做事的方式。 :)它通过不显示一堆星号来提供一点额外的安全性。这样,看到您屏幕的人就无法看到您密码的长度。
但我必须承认,当你输入密码时没有得到任何反馈有点可怕,特别是如果你的键盘不好的话。因此,*nix 系统上的大多数 GUI 密码对话框确实会给您某种反馈,例如使用星号,或更常见的是 ⬤。有些甚至在您键入时显示每个字符,然后立即将其替换为*
或 ⬤,但如果有人可能在监视您,那就不太好了。或者,如果他们有一个设备可以拾取并解码从您的计算机发送到显示器的视频信号。
答案3
使密码不可见可以使其更加安全,因为其他人无法看到密码的长度。这可以避免其他人尝试从密码长度猜测密码并登录您的帐户的风险。