如何在python中完成密码输入,并为用户的每个字符打印星号?

Reg*_*May 22 python security passwords console command-line

据我所知,此问题之前已被提出,但仍然缺乏答案.所以我再次提出这个问题,以便最终得到这个问题的答案.(如果我错了,请给我答案的网址.)

问题:程序员希望用户输入密码.在将getpass()函数就是为了这个目的很好,但它的使用有一个缺点:当输入密码没有打印到标准输出.

问题:如何在为用户键入的每个字符打印星号时实现getpass()?(当然,退格 -甚至是POS1结束 -应采取相应的照顾.)

动机:社区中有人不理解为什么要问这个问题.然后用a)引用getpass(),这样忽略了手头的任务,b)没有考虑那个引用不会回答问题.之所以可能希望打印星号是为了方便用户:他们在密码输入期间获得直接的视觉响应.因此,他们不会因按键而感到困惑,而且 - 在那里 - 似乎没有任何事情发生.

迈向解决方案的一步:

让我在这里向解决方案迈出第一步.请帮忙,以便将其演变成真正的解决方案.

有一个名为getch的模块似乎允许从stdin逐字符读取.Backspace非常奇怪地映射到127的整数值,但是这样的解决方案可能如下所示:

def readLineWithAsterisks():
    sBuffer = ''
    while True:
        c = getch.getch()
        if c == '\n':
            return sBuffer
        elif ord(c) == 127:
            if len(sBuffer) > 0:
                sys.stdout.write('\x08 \x08')
                sys.stdout.flush()
                sBuffer = sBuffer[0:-1]
            continue
        else:
            sys.stdout.write('*')
            sys.stdout.flush()
            sBuffer += c
Run Code Online (Sandbox Code Playgroud)

但是这段代码有一些缺点.首先,我非常困惑c如果进入退格,则不是'\ b' .也许这样有解释?仅处理第二个ASCII字符,至少在Linux上是这样.我在这里不了解Windows,但如果按下A-Z0-9以外的字符,则行c = getch.getch()将抛出异常.getch()似乎无法处理变音符号和其他类型的字符,至少在某种程度上如此.

要解决方案输入,应解决以下问题:

  • 对于非ASCII字符,如何逐字逐句地读取stdin
  • 如何以独立于平台的方式完成?
  • 如何安全地完成这项工作(没有安全问题)?(将getpass某种程度上似乎为解决这一点,但我不完全了解.)

也许没有人知道这件事.据我所知,之前曾被问过这样的问题仍然没有答案.但也许社区中有一些软件开发人员了解所有这些并且可以在这里提供帮助吗?成功后,我可以在GitHub上获得作为python模块提供的解决方案.

Loï*_*oïc 5

看那里的第一个答案:

从终端检测python中键盘输入的最简单方法是什么?

只需按下按键即可打印星号'*'或任何内容.

所有的功劳显然都归功于Phylliida的研究.


小智 -1

使用 tkinter 可能更容易,尽管可能不那么安全,这是我能得到的最接近您要求的东西。

from tkinter import *
from tkinter import ttk

root = Tk()
parent = ttk.Frame(root)
parent.grid()

password = ttk.Entry(parent, show="*").grid()#shows each character as an asterix

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

抱歉我无法提供更多帮助。