Как преобразовать пароль в звездочки во время его ввода?

Есть ли способ в 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)
Другие вопросы по тегам