Как сделать так, чтобы пароль отображался звездочками

Я пытаюсь создать окно входа в систему, в котором пользователю предлагается ввести свое имя пользователя и пароль, хотя при вводе пароля я ищу звездочки для печати, например, общий ввод пароля (т.е. - 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

Любая помощь будет оценена по достоинству.


person zk-Jack    schedule 12.06.2012    source источник
comment
Вам действительно следует рассмотреть возможность использования getpass(). Я понимаю, что вы уже нашли это, но отсутствие повторения чего-либо на самом деле улучшает безопасность.   -  person ThiefMaster    schedule 12.06.2012
comment
@ThiefMaster Я вижу, как это улучшит безопасность, но приложение в основном предназначено для некоторых моих друзей в одной из моих игровых сетей, которые не очень хорошо разбираются в компьютерах, поэтому я пытаюсь сделать его где-то между безопасным и удобный для пользователя - вот почему я решил попробовать, чтобы звездочки отображались, а не ничего.   -  person zk-Jack    schedule 12.06.2012
comment
Ознакомьтесь с модулем curses   -  person Joel Cornett    schedule 12.06.2012
comment
Улучшение безопасности за счет сокрытия длины пароля довольно небольшое, а отсутствие ответа при вводе — довольно большая потеря удобства использования.   -  person Reid    schedule 22.07.2021


Ответы (3)


Вы должны иметь возможность стереть звездочку, написав символы \x08 \x08. \x08 переместит курсор на одну позицию назад, пробел заменит звездочку, затем последний \x08 снова переместит курсор назад, поместив его в правильное положение для записи следующего *.

С самого начала я не знаю, как определить, когда набрана клавиша Backspace, но вы легко можете это сделать: просто добавьте что-то вроде print repr(x) после того, как вы вызвали x = msvcrt.getch(), затем запустите свою программу и нажмите клавишу Backspace.

person David Wolever    schedule 12.06.2012
comment
Рад, что это работает. Пожалуйста, рассмотрите возможность пометить мой ответ как принятый и, возможно, проголосовать за него, если он был особенно полезен. - person David Wolever; 12.06.2012

Я думаю, что этот способ очень простой и эффективный

import sys
import msvcrt

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

print '\n'+passwor
person Ahmed ALaa    schedule 30.04.2017

Я сделал все это много лет назад... в Shell...

Для идей по его дальнейшему улучшению... https://antofthy.gitlab.io/info/crypto/passwd_askpass_stars.txt

Окончательный сценарий с множеством наворотов и все еще развивающийся https://antofthy.gitlab.io/software/#askpass_stars

Обратите внимание, что вам действительно не следует включать это прямо в вашу программу, но сделайте его помощником по паролю, чтобы многие программы могли его использовать. Например: установите программу, используя переменную среды (например, TTY_ASKPASS) или другую конфигурацию.

См. https://stackoverflow.com/a/67327327/701532.

Делая это, вы не ограничиваете пользователя тем, что вы предоставляете, но позволяете получать пароль из других мест. ssh и даже sudo тоже это делают.

person anthony    schedule 30.04.2021