Как преобразовать пароль в звездочки во время его ввода?
Есть ли способ в Python для преобразования символов, когда они вводятся пользователем, в звездочки, как это можно увидеть на многих сайтах?
Например, если пользователю электронной почты было предложено войти в свою учетную запись, при вводе его пароля он будет отображаться не как символы, а как *
после каждого отдельного удара без какой-либо временной задержки.
Если фактический пароль был KermitTheFrog
, это будет выглядеть как *************
когда набрано.
10 ответов
Есть getpass()
, функция, которая скрывает пользовательский ввод.
import getpass
password = getpass.getpass()
print(password)
Если вам нужно решение, работающее в Windows/macOS/Linux и на Python 2 и 3, вы можете установить
stdiomask
модуль:
pip install stdiomask
в отличие
getpass.getpass()
(который находится в стандартной библиотеке Python),
stdiomask
модуль может отображать символы маски *** по мере ввода.
Пример использования:
>>> 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'
К сожалению, этот модуль, как и встроенный в Python
getpass
модуль, не работает в IDLE или Jupyter Notebook.
Подробнее на https://pypi.org/project/stdiomask/
Если вы используете Tkinter:(это Python 2.x. Однако, 3.x будет очень похож)
from Tkinter import *
master = Tk()
PassWord = Entry(master, bd=5, width=20, show="*")
PassWord.pack()
master.mainloop()
В оболочке это невозможно. Однако вы можете написать функцию для хранения введенного текста и сообщать только строку * при вызове. Вроде как, о котором я не писал. Я просто погуглил это.
Вы можете сделать это:
# if getch module is available, then we implement our own getpass() with asterisks,
# otherwise we just use the plain boring getpass.getpass()
try:
import getch
def getpass(prompt):
"""Replacement for getpass.getpass() which prints asterisks for each character typed"""
print(prompt, end='', flush=True)
buf = ''
while True:
ch = getch.getch()
if ch == '\n':
print('')
break
else:
buf += ch
print('*', end='', flush=True)
return buf
except ImportError:
from getpass import getpass
Сначала установите эти две библиотеки
pip install getpass
pip install stdiomask
обратите внимание, что вы устанавливаете std io mask, а не studiomask .....
а затем код
password = stdiomask.getpass() # It will ask to enter password and display * on the screen
print(password)
Это результат решения:
Password: *****
google
Для тех, кто действительно хотел бы, чтобы появились звездочки, вот улучшение ответа Тиграна Айвазяна. Эта версия импортирует встроенныйmsvcrt.getch
, добавляет регистры для разных окончаний строки при нажатии 'Enter/Return' и включает логику для поддержки Backspace, а также Ctrl+C (KeyboardInterrupt):
try:
from msvcrt import getch
def getpass(prompt):
"""Replacement for getpass.getpass() which prints asterisks for each character typed"""
print(prompt, end='', flush=True)
buf = b''
while True:
ch = getch()
if ch in {b'\n', b'\r', b'\r\n'}:
print('')
break
elif ch == b'\x08': # Backspace
buf = buf[:-1]
print(f'\r{(len(prompt)+len(buf)+1)*" "}\r{prompt}{"*" * len(buf)}', end='', flush=True)
elif ch == b'\x03': # Ctrl+C
raise KeyboardInterrupt
else:
buf += ch
print('*', end='', flush=True)
return buf.decode(encoding='utf-8')
except ImportError:
from getpass import getpass
Не стесняйтесь предлагать любые другие изменения или способы улучшения этого; Я довольно быстро внес изменения, особенно с помощью логики Backspace.
Вы можете проверить getpass
функция.
Запрашивать у пользователя пароль без повторения. Пользователю предлагается использовать строковое приглашение, которое по умолчанию имеет значение "Пароль:". В Unix приглашение записывается в поток файловоподобных объектов. По умолчанию поток используется управляющим терминалом (/dev/tty) или, если он недоступен для sys.stderr (этот аргумент игнорируется в Windows).
Примечание. Этот модуль имитирует запросы пароля Unix и не отображает звездочки.
Использование:
import getuser
getuser.getpass()
При использовании getpass
в python ничего не указывается для отображения ввода пароля.
это можно решить с помощью этого простого решения:
просто скопируйте ‘getpass_ak.py’
модуль, указанный в ссылке на папку Lib Python.
https://starrernet.wixsite.com/analytix/python-coder
используйте следующий код:
import getpass_ak
a = (getpass_ak.getpass('password: '))
это добавит * к вашему паролю.
Мое собственное предложение - НЕ ДЕЛАЙТЕ ЭТОГО!
Не изобретайте велосипед, используйте помощник по паролю, если хотите «звездочки»
Вместо этого сделайте что-то вроде следующего псевдокода ... Если установлена переменная среды TTY_ASSPASS - вызовите этот помощник по паролю. Доступно число, включая "systemd-ask-password". Если есть TTY - вернуться к чтению без эха (getpass.getpass()) Если нет TTY, - откатиться, просто прочитайте STDIN с помощью rstrip ()
Это не только позволяет пользователю выбрать программу ввода пароля (через переменную среды (или другую конфигурацию), но также позволяет им заменять другие источники паролей, такие как ввод графического интерфейса или сбор пароля от предварительно открытого демона паролей связки ключей, или в другом месте
Не ограничивайте и не ограничивайте иным образом источник паролей!
Примечания о помощниках по паролям см. .. https://antofthy.gitlab.io/info/crypto/passwd_input.txt.
Для помощника по паролю сценария оболочки https://antofthy.gitlab.io/software/#askpass_stars
Похоже, ответ Андрея Кривошея уже положил начало этому, что привело к чему-то очень похожему, но все еще в зачаточном состоянии.
Я объединил ответы @Tigran Aivazian и @Ahndwoo в полностью рабочее решение:
- ! дополнительный код для возврата
{b'\x08', b'\x7f'}: # Backspace
добавлен - для
Ctrl+C
комбинация используется бесшумный возврат. Вraise KeyboardInterrupt
сейчас закомментирован, но его можно раскомментировать, чтобы сообщить об ошибке.
# if getch module is available, then we implement our own getpass() with asterisks,
# otherwise we just use the plain boring getpass.getpass()
try:
from getch import getch
def getpass(prompt):
"""Replacement for getpass.getpass() which prints asterisks for each character typed"""
print(prompt, end='', flush=True)
buf = b''
while True:
ch = getch().encode()
if ch in {b'\n', b'\r', b'\r\n'}:
print('')
break
elif ch == b'\x03': # Ctrl+C
# raise KeyboardInterrupt
return ''
elif ch in {b'\x08', b'\x7f'}: # Backspace
buf = buf[:-1]
print(f'\r{(len(prompt)+len(buf)+1)*" "}\r{prompt}{"*" * len(buf)}', end='', flush=True)
else:
buf += ch
print('*', end='', flush=True)
return buf.decode(encoding='utf-8')
except ImportError:
from getpass import getpass
password = getpass('Enter password: ')
print(password)