Рубрики
Без рубрики

getpass – запрос безопасного пароля

Автор оригинала: Doug Hellmann.

Цель:

Запрашивать у пользователя значение, обычно пароль, без вывода на консоль того, что он вводит.

Многие программы, которые взаимодействуют с пользователем через терминал, должны запрашивать у пользователя значения пароля, не показывая, что пользователь вводит на экране. Модуль getpass предоставляет переносимый способ безопасной обработки таких запросов пароля.

Пример

Функция getpass () печатает приглашение, а затем считывает ввод от пользователя, пока он не нажмет return. Ввод возвращается вызывающей стороне в виде строки.

getpass_defaults.py

import getpass

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

Приглашение по умолчанию, если вызывающий абонент не указал его, будет « Пароль: ».

$ python3 getpass_defaults.py

Password:
You entered: sekret

Запрос можно изменить на любое необходимое значение.

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!')

Некоторые программы запрашивают парольную фразу вместо простого пароля для большей безопасности.

$ python3 getpass_prompt.py

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

$ python3 getpass_prompt.py

What is your favorite color?
Auuuuugh!

По умолчанию getpass () использует sys.stdout для печати строки приглашения. Для программы, которая может производить полезный вывод в sys.stdout , часто лучше отправить приглашение в другой поток, например sys.stderr .

getpass_stream.py

import getpass
import sys

p  getpass.getpass(streamsys.stderr)
print('You entered:', p)

Использование sys.stderr для приглашения означает, что стандартный вывод может быть перенаправлен (в канал или файл) без отображения запроса пароля. Значение, введенное пользователем, по-прежнему не выводится на экран.

$ python3 getpass_stream.py >/dev/null

Password:

Использование getpass без терминала

В Unix для getpass () всегда требуется терминал, которым он может управлять с помощью termios , поэтому эхо ввода можно отключить. Это означает, что значения не будут считываться из нетерминального потока, перенаправленного на стандартный ввод. Вместо этого getpass пытается получить доступ к tty для процесса, и не возникает никаких ошибок, если они могут получить к нему доступ.

$ echo "not sekret" | python3 getpass_defaults.py

Password:
You entered: sekret

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

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)

С tty:

$ python3 ./getpass_noterminal.py

Using getpass:
Read:  sekret

Без tty:

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

Using readline
Read:  sekret

Смотрите также