2011-10-20 16 views
8

Estoy escribiendo un programa de consola con Python en Windows.
El usuario necesita iniciar sesión para usar el programa, cuando ingresa su contraseña, me gustaría que se repita como "*", mientras que puedo obtener lo que el usuario ingresa.
Encontré en la biblioteca estándar un módulo llamado getpass, pero no hará eco cuando ingresas (como linux).
Gracias.¿Cómo se lee la contraseña con echo "*" en el programa de la consola Python?

Respuesta

7

El módulo getpass está escrito en Python. Podrías modificarlo fácilmente para hacer esto. De hecho, aquí es una versión modificada de getpass.win_getpass() que usted podría pegar en su código:

import sys 

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    import msvcrt 
    for c in prompt: 
     msvcrt.putch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      pw = pw[:-1] 
      msvcrt.putch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putch("*") 
    msvcrt.putch('\r') 
    msvcrt.putch('\n') 
    return pw 

Es posible que desee volver a examinar esto, sin embargo. La forma de Linux es mejor; incluso el solo hecho de saber la cantidad de caracteres en una contraseña es una pista importante para alguien que quiere descifrarlo.

+0

msvcrt.putch ('\ b') parece que esto no funciona – wong2

-1

You can use the getpass module. Esto no responde exactamente la pregunta porque la función getpass no arroja nada a la consola a excepción del aviso. La razón de esto es que es una capa adicional de seguridad. Si alguien está mirando por encima de su hombro, no podrán averiguar cuánto tiempo es su contraseña.

Aquí hay un ejemplo de cómo se usa:

from getpass import getpass 
getpass('Enter your password: ') 

Este ejemplo mostrará el mensaje "Introduzca su contraseña:" y entonces usted puede escribir su contraseña.

+0

'getpass' se mencionó en la pregunta original y se rechazó porque no refleja los asteriscos. – kindall

4

La respuesta de kindall está cerca, pero tiene problemas con el retroceso que no borra los asteriscos, así como con el retroceso que puede ir más allá del mensaje de entrada.

Probar:

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    if sys.stdin is not sys.__stdin__: 
     return fallback_getpass(prompt, stream) 
    import msvcrt 
    for c in prompt: 
     msvcrt.putwch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getwch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      if pw == '': 
       pass 
      else: 
       pw = pw[:-1] 
       msvcrt.putwch('\b') 
       msvcrt.putwch(" ") 
       msvcrt.putwch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putwch("*") 
    msvcrt.putwch('\r') 
    msvcrt.putwch('\n') 
    return pw 

Nota mscvrt.putwch no funciona con Python 2.x, es necesario utilizar mscvrt.putch lugar.

Cuestiones relacionadas