412 votes

Obtenir la saisie d'un mot de passe caché

Vous savez comment, sous Linux, lorsque vous essayez un truc Sudo, on vous demande d'entrer le mot de passe et, lorsque vous tapez, rien ne s'affiche dans la fenêtre du terminal (le mot de passe n'est pas affiché) ?

Existe-t-il un moyen de faire cela en Python ? Je travaille sur un script qui nécessite des informations sensibles et j'aimerais qu'elles soient cachées lorsque je les tape.

En d'autres termes, je veux obtenir le mot de passe de l'utilisateur sans afficher le mot de passe.

572voto

Sven Marnach Points 133943

Utilisation getpass.getpass() :

from getpass import getpass
password = getpass()

Une invite facultative peut être passée en paramètre ; la valeur par défaut est "Password: " .

Notez que cette fonction nécessite un terminal approprié, afin de pouvoir désactiver l'écho des caractères tapés - voir "GetPassWarning : Impossible de contrôler l'écho sur le terminal" lors de l'exécution à partir de IDLE pour plus de détails.

0 votes

Fonctionnera, mais comment se prémunir contre un "hacker" qui fera une copie du script et commentera ensuite la ligne qui demande le mot de passe de l'utilisateur ?

205 votes

@asf107 : Si le pirate peut modifier le code source, il y a d'autres problèmes à craindre.

24 votes

@asf107 - L'idée derrière la demande d'un mot de passe est de pouvoir le transmettre pour s'authentifier auprès de quelque chose (je l'utilise pour demander un mot de passe pour m'authentifier auprès d'un serveur en ligne). Si un hacker commente la ligne, le programme échouera simplement parce que le serveur ne sera plus authentifié. L'idée derrière l'utilisation de getpass() est de faire en sorte que personne ne puisse consulter le code source et découvrir votre mot de passe en le lisant, et que personne ne puisse obtenir votre mot de passe en regardant par-dessus votre épaule et en lisant votre mot de passe sur l'écran lorsque vous le saisissez.

207voto

Nafscript Points 155
import getpass

pswd = getpass.getpass('Password:')

passe-partout fonctionne sous Linux, Windows et Mac.

24 votes

"Le mot de passe : " (avec un espace après les deux points) est l'invite par défaut, il n'est donc souvent pas nécessaire de le spécifier dans l'appel à getpass.getpass().

1 votes

Getpass est un module de la bibliothèque standard qui existe depuis au moins Python 2.5.

2 votes

Ceci m'a donné une erreur Warning (from warnings module): File "C:\Python27\lib\getpass.py", line 92 return fallback_getpass(prompt, stream) GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed. dans l'IDLE, mais fonctionnait bien dans l'invite de commande. aquí

27voto

RanRag Points 9395

Utilisation passe-partout à cette fin.

getpass.getpass - Demande à l'utilisateur un mot de passe sans écho

0 votes

Et pourquoi pas avec l'écho des caractères * ?

21voto

Ahmed ALaa Points 177

Ce code imprimera un astérisque à la place de chaque lettre.

import sys
import msvcrt

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

print '\n'+passwor

4voto

Mostafa Hassan Points 151

Mise à jour de la réponse de @Ahmed ALaa

# import msvcrt
import getch

def getPass():
    passwor = ''
    while True:
        x = getch.getch()
        # x = msvcrt.getch().decode("utf-8")
        if x == '\r' or x == '\n':
            break
        print('*', end='', flush=True)
        passwor +=x
    return passwor

print("\nout=", getPass())

msvcrt n'est utilisé que pour Windows, mais getch de PyPI devrait fonctionner pour les deux (je n'ai testé qu'avec linux). Vous pouvez également commenter/décommenter les deux lignes pour que cela fonctionne pour Windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X