getpass —Solicitud segura de contraseña

Propósito:Solicita al usuario un valor, generalmente una contraseña, sin repetir lo que escribe en la consola.

Muchos programas que interactúan con el usuario a través de la terminal necesitan preguntar al usuario valores de contraseña sin mostrar lo que escribe el usuario la pantalla. El módulo getpass proporciona una forma portátil de manejar tales solicitudes de contraseña de forma segura.

Ejemplo

La función getpass() imprime un mensaje, luego lee la entrada del usuario hasta que presione retorno. La entrada se devuelve como una cadena al que la llama.

getpass_defaults.py
import getpass

try:
    p = getpass.getpass()
except Exception as err:
    print('ERROR:', err)
else:
    print('You entered:', p)

La solicitud predeterminada, si la persona que llama no especifica ninguna, es «Password:».

$ python3 getpass_defaults.py

Password:
You entered: sekret

La solicitud se puede cambiar a cualquier valor necesario.

getpass_prompt.py
import getpass

p = getpass.getpass(prompt='What is your favorite color? ')
if p.lower() == 'blue':
    print('Right.  Off you go.')
else:
    print('Auuuuugh!')

Algunos programas solicitan una frase de contraseña en lugar de una contraseña simple, para dar mejor seguridad.

$ python3 getpass_prompt.py

What is your favorite color?
Right.  Off you go.

$ python3 getpass_prompt.py

What is your favorite color?
Auuuuugh!

Por defecto, getpass() usa sys.stdout para imprimir la cadena de solicitud. Para un programa que puede producir resultados útiles en sys.stdout, con frecuencia es mejor enviar la solicitud a otro flujo como sys.stderr.

getpass_stream.py
import getpass
import sys

p = getpass.getpass(stream=sys.stderr)
print('You entered:', p)

El uso de sys.stderr para la solicitud significa que la salida estándar puede ser redirigida (a una tubería o un archivo) sin ver la solicitud de contraseña. El valor ingresado por el usuario no se repite en la pantalla.

$ python3 getpass_stream.py >/dev/null

Password:

Usar getpass sin terminal

En Unix, getpass() siempre requiere un tty que puede controlar a través de termios, por lo que la reproducción de la entrada se puede deshabilitar. Esto significa que no se leerán valores desde un flujo no terminal redirigido a la entrada estándar. En cambio, getpass intenta llegar al tty de un proceso, y no se genera ningún error si pueden acceder a él.

$ echo "not sekret" | python3 getpass_defaults.py

Password:
You entered: sekret

Depende de la persona que llama detectar cuándo el flujo de entrada no es un tty, y usar un método alternativo para leer en ese caso.

getpass_noterminal.py
import getpass
import sys

if sys.stdin.isatty():
    p = getpass.getpass('Using getpass: ')
else:
    print('Using readline')
    p = sys.stdin.readline().rstrip()

print('Read: ', p)

Con un tty:

$ python3 ./getpass_noterminal.py

Using getpass:
Read:  sekret

Sin un tty:

$ echo "sekret" | python3 ./getpass_noterminal.py

Using readline
Read:  sekret

Ver también