如何将密码回显为星号

Posted

技术标签:

【中文标题】如何将密码回显为星号【英文标题】:How to have password echoed as asterisks 【发布时间】:2012-06-15 00:01:38 【问题描述】:

我正在尝试创建一个登录窗口,提示用户输入他们的用户名和密码,尽管在输入密码时我正在寻找要打印的星号,例如常见的密码输入(即 - Sekr3t 已回显如:* * * * * *)。

这是我到目前为止的代码,我不知道为什么它不回显星号:

import msvcrt
import sys

def login(prompt = '> '):
   write = sys.stdout.write
   
   for x in prompt:
       msvcrt.putch(x)
   passw = ""
   
   while 1:
       x = msvcrt.getch()
       if x == '\r' or x == '\n':
           break
       if x == '\b':
           # position of my error
           passw = passw[:-1]
       else:
           write('*')
           passw = passw + x
   msvcrt.putch('\r')
   msvcrt.putch('\n')
   return passw

任何帮助将不胜感激。

【问题讨论】:

你真的应该考虑使用getpass()。我知道您已经发现了这一点,但实际上没有回应任何 提高安全性 @ThiefMaster 我可以看到它将如何提高安全性,但该应用程序主要是为我的一个游戏网络中的一些朋友提供的,他们不是很擅长计算机,所以我正在尝试让它介于安全和用户友好之间——这就是为什么我选择尝试让星号回显而不是什么都没有。 查看curses 模块 隐藏密码长度的安全性提升很小,输入时无响应是相当大的可用性成本。 【参考方案1】:

您应该能够通过写入字符\x08 \x08 来擦除星号。 \x08 会将光标向后移动一个位置,空格将覆盖星号,然后最后一个 \x08 将光标再次向后移动,将其放在正确的位置以写入下一个 *

我不知道如何确定何时键入退格键,但您可以轻松做到:只需在调用 x = msvcrt.getch() 后添加类似 print repr(x) 的内容,然后启动您的程序然后按退格键。

【讨论】:

很高兴它有效。请考虑将我的答案标记为“已接受”,如果它特别有帮助,可能会予以支持。【参考方案2】:

我觉得这种方式非常简单有效

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor

【讨论】:

【参考方案3】:

我这么多年前都做过……在 Shell 中……

关于进一步改进它的想法... https://antofthy.gitlab.io/info/crypto/passwd_askpass_stars.txt

包含许多花里胡哨且仍在不断发展的最终剧本 https://antofthy.gitlab.io/software/#askpass_stars

请注意,您确实不应该将其直接包含在您的程序中,而是将其设置为密码助手,以便许多程序可以使用它。 EG:使用环境变量(如 TTY_ASKPASS)或其他配置设置程序。

见https://***.com/a/67327327/701532

通过这样做,您不会将用户限制为您提供的内容,而是允许从其他地方获取密码。 "ssh" 甚至 "sudo" 也可以这样做。

【讨论】:

以上是关于如何将密码回显为星号的主要内容,如果未能解决你的问题,请参考以下文章

http账户密码的截取

在 BigCommerce HTML href 中回显 PHP(自引用 hreflang 标签)

如何在不回显的情况下从 shell 脚本中获取密码

用破折号替换 %20

如何从最小索引到最大索引对 SQL 结果进行排序?

从 PHP 中提取超过 1 个回显