如何将密码回显为星号
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" 也可以这样做。
【讨论】:
以上是关于如何将密码回显为星号的主要内容,如果未能解决你的问题,请参考以下文章