【问题标题】: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 模块
  • 隐藏密码长度的安全性提升很小,输入时无响应是相当大的可用性成本。

标签: python passwords echo msvcrt getch


【解决方案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://stackoverflow.com/a/67327327/701532

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 2016-06-18
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多