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

标签 python security command-line console passwords

问题:程序员希望用户输入密码。 getpass() 函数非常适合此目的,但它的使用有一个缺点:输入密码时,不会将任何内容打印到 stdout

问题:如何在为用户键入的每个字符打印星号时实现 getpass()? (当然 backspace - 理想情况下 pos1end - 应该得到相应的照顾。)

动机:社区中有些人不明白为什么要问这个问题。然后用 a) 引用 getpass() 以忽略手头的任务和 b) 不考虑引用不会回答问题。 s.o. 的原因可能想要打印星号是为了方便用户:他们在密码输入期间得到直接的视觉响应。因此,他们不会因为按键而感到困惑,而且 - 在那里的眼睛 - 似乎什么都没有发生。

迈向解决方案的一步:

让我在这里介绍解决方案的第一步。请帮助将其演变成真正的解决方案。

有一个名为 getch 的模块,它似乎允许从 stdin 中逐个字符地读取。退格 - 很奇怪 - 映射到整数值 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

但是这段代码有一些缺点。首先,我对 c 不是 '\b' if s.o. 感到非常困惑。输入了一个退格键。可能是这样。对此有解释吗?其次,至少在 Linux 上只处理 ASCII 字符。我不了解这里的 Windows,但是如果按下 A-Z0-9 以外的字符,c = getch.getch() 行会抛出异常。 getch() 似乎无法处理变音符号和其他类型的字符,至少在某种程度上是这样。

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

  • 对于非 ASCII 字符,如何逐个字符地读取 stdin
  • 如何以独立于平台的方式做到这一点?
  • 如何安全地完成此操作(没有安全问题)? (getpass 似乎以某种方式解决了这个问题,但我不完全理解如何。)

最佳答案

在那里查看第一个答案:

What's the simplest way of detecting keyboard input in python from the terminal?

只需在按下某个键时打印星号 '*' 或其他任何内容。

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

关于python - 如何在 python 中输入密码并为用户的每个字符打印一个星号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40651085/

相关文章:

python - 随机访问 C++ 和 Python 的 Linux 内存映射文件性能不佳

Python/Regex - 括号和斜杠的扩展

python - 如何从 flask 的日志记录中删除 "- -"?

python - 如何在 Pandas 列内的日期范围之间生成随机日期?

php - 在我公司的 MySQL 数据库中加密客户信息的最佳方法?

oracle - 在FlywayDb迁移中使用 "connect sys as sysdba"时出错

java - 在首选项/属性文件中加密密码 - Java

javascript - 离线网络应用程序中的安全用户身份验证

c++ - 如何从 VC 2005 (C++) 中的命令行创建字符串预处理器定义?

node.js - Node js 模块的命令行文档查看器