为什么我输入的密码不可见?

Kai*_*lar 40 command-line password terminal passwd

下面是我在 Linux 中的 bash 上创建用户的过程的图像。

在bash中创建用户并分配密码

我知道出于安全目的不应显示密码,但我的意思是,为什么不出现星号(或我输入的字符)?

Gil*_*il' 85

隐藏用户输入的最简单方法是什么?

不显示!

在输入密码时隐藏密码是一种古老的传统。在大多数情况下,从安全角度来看,In 是有意义的:如果有人从你的肩膀上看,你不想让你很容易看到你正在输入的内容。(一些现代安全指南,例如1 2 3 4 5确实建议有一个选项使密码可见,因为这允许用户能够选择更复杂的密码,并有信心他们不会花时间修复看不见的错别字。最大的风险不是肩膀冲浪,而是蛮力猜测,可能是离线。)

决定应该隐藏密码后,实施者必须决定如何去做。终端具有显示用户输入的模式(回显打开)和不显示用户输入的模式(回显关闭)。回声关闭模式在某种程度上具有内在的存在:在这种模式下,终端不执行回显用户输入的额外工作。对于键入键不会插入该字符而是调用绑定到该键的某些应用程序快捷方式的应用程序,也必须存在此模式。所以命令就像passwd在他们读取密码时将终端设置为回显模式一样。

为每个字符打印星号需要额外的实现工作,但收益相对较小,passwd命令的实现者并不喜欢这样做。没有用于打印星号的终端模式,因为它是一项非常专业的功能,仅在输入密码时有用。

顺便说一句,如果您想在更改密码时看到密码,您可以使用cat | passwd(至少在某些系统上 - 有些版本passwd需要一个选项cat | passwd --stdin,有些则根本不接受)。(你甚至可以这样做{ echo 'current password'; echo 'new password'; echo 'new password'; } | passwd,但不要那样做:它会将密码保存在 shell 历史记录中,从中泄露的风险要大得多。)使用从终端读取密码的命令而不是其他任何内容来安排它它们的标准输入,例如sudoor ssh,更复杂;如果您有可用的 GUI,则可以使用 ssh-askpass,它会显示您键入的字符数(SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A对于 sudo;对于 ssh,当您从终端调用它时会很复杂)。

  • 终端处理程序负责简单的编辑功能(如退格)和缓冲行。使用 fgets() 读取的行在按下 Enter 之前不会返回。所以这使得打印星号变得棘手。如果您一次读取一个字符并回显星号,您将失去退格功能,或者需要额外的努力来支持它。 (4认同)
  • 附录:“做额外工作”以响应用户输入的终端是所谓的“全双工”终端。Ye Olde Days 中也有“半双工”终端,字符在输入时终端立即显示,OS 不将其发送回终端显示。如果我没记错的话,这些终端无法关闭回声。 (2认同)

PM *_*ing 43

因为这就是我们在 *nix 土地上做事的方式。:)它通过不显示一堆星号来提供一点额外的安全性。这样,看到您屏幕的人就无法看到您的密码长度。

但我必须承认,当您输入密码时没有得到任何反馈,这有点可怕,尤其是当您的键盘不好时。因此,*nix 系统上的大多数 GUI 密码对话框确实会给您某种反馈,例如使用星号,或更常见的是?。有些甚至在您键入时显示每个字符,然后立即将其替换为 a*或 ?,但如果有人可能从您的肩膀上看,那就不太好了。或者,如果他们有可以接收和解码从您的计算机发送到您的显示器的视频信号的设备。

  • 这个答案还不错,但恕我直言,吉尔斯给出了真正的答案。几乎可以肯定,实现者并没有真正考虑“一点额外的安全性”,也绝对没有考虑用户体验。他们这样做是因为这样做既便宜又容易。然后,后来,我们开始期望它继续以这种方式工作...... (8认同)
  • ...在`stty -echo`的帮助下 (6认同)
  • @Celada:公平点。FWIW,我已经对吉尔斯的出色回答投了赞成票。 (2认同)
  • @Celada 增加的安全性可能不会导致最初决定不显示任何内容,但我一直认为这是一个好处,并且可以看到其他人的这种想法可能为保持这种方式提供了一个很好的理由。 (2认同)
  • 我认为最后输入的字符的简短显示主要是一种移动方法,可能是因为在微小的屏幕键盘上打字更容易出错。我想我从来没有在桌面应用程序中见过它。 (2认同)