Enmascarar la entrada del usuario en python con asteriscos
passwords masking (4)
Dependiendo del sistema operativo, la forma en que obtiene un solo carácter de la entrada del usuario y cómo verificar el retorno de carro será diferente.
Ver esta publicación: Python leyó un solo personaje del usuario
En OSX, por ejemplo, podría hacer algo como esto:
import sys, tty, termios
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
key = ""
sys.stdout.write(''Password :: '')
while True:
ch = getch()
if ch == ''/r'':
break
key += ch
sys.stdout.write(''*'')
print
print key
Estoy tratando de enmascarar lo que el usuario escribe en IDLE con asteriscos para que las personas que lo rodean no puedan ver lo que están escribiendo / han escrito. Estoy usando información básica básica para recopilar lo que escriben.
key = raw_input(''Password :: '')
Indicador IDLE ideal después de que el usuario ingrese la contraseña:
Password :: **********
Descargo de responsabilidad: no proporciona el asterisco en la terminal, pero lo hace en jupyter notebook.
El código siguiente reemplaza los caracteres escritos con asteriscos y permite la eliminación de caracteres mal escritos. El número de asteriscos refleja el número de caracteres escritos.
import getpass
key = getpass.getpass(''Password :: '')
Y después de que el usuario presione enter:
Para resolver esto, escribí este pequeño módulo pyssword para enmascarar la contraseña de entrada del usuario en el indicador. Funciona con ventanas. El código está abajo:
from msvcrt import getch
import getpass, sys
def pyssword(prompt=''Password: ''):
''''''
Prompt for a password and masks the input.
Returns:
the value entered by the user.
''''''
if sys.stdin is not sys.__stdin__:
pwd = getpass.getpass(prompt)
return pwd
else:
pwd = ""
sys.stdout.write(prompt)
sys.stdout.flush()
while True:
key = ord(getch())
if key == 13: #Return Key
sys.stdout.write(''/n'')
return pwd
break
if key == 8: #Backspace key
if len(pwd) > 0:
# Erases previous character.
sys.stdout.write(''/b'' + '' '' + ''/b'')
sys.stdout.flush()
pwd = pwd[:-1]
else:
# Masks user input.
char = chr(key)
sys.stdout.write(''*'')
sys.stdout.flush()
pwd = pwd + char
Si desea una solución que funcione en Windows / macOS / Linux y en Python 2 y 3, puede instalar el módulo
stdiomask
:
pip install stdiomask
A diferencia de
getpass.getpass()
(que se encuentra en la Biblioteca estándar de Python), el módulo
stdiomask
puede mostrar caracteres de máscara *** mientras escribe.
Ejemplo de uso:
>>> stdiomask.getpass()
Password: *********
''swordfish''
>>> stdiomask.getpass(mask=''X'') # Change the mask character.
Password: XXXXXXXXX
''swordfish''
>>> stdiomask.getpass(prompt=''PW: '', mask=''*'') # Change the prompt.
PW: *********
''swordfish''
>>> stdiomask.getpass(mask='''') # Don''t display anything.
Password:
''swordfish''
Más detalles en https://pypi.org/project/stdiomask/