Некоторые проблемы, с которыми я сталкиваюсь:
- Вы отображаете пароль, который вводит пользователь.
- Вы примете любое имя пользователя и любой пароль, что означает, что я мог войтив любой учетной записи с моим паролем.
- Никогда не сохраняйте пароль в открытом виде.
Я не нашел переносимого способа не отображать пароли.# 2 решается с помощью словаря.Что касается # 3, вы, вероятно, захотите использовать модуль hashlib :
from hashlib import sha224
PASSWORD_HASHES = {}
def set_password(account, raw_password):
PASSWORD_HASHES[account] = sha224(raw_password).digest()
def authenticate(account, raw_password):
if account not in PASSWORD_HASHES:
return False
return PASSWORD_HASHES[account] == sha224(raw_password).digest()
Замените sha224
любым алгоритмом хеширования, который вы хотите;Я не отслеживал, какие из них все еще хороши для паролей.
РЕДАКТИРОВАТЬ: Относительно проблемы # 1, если вы используете систему на основе POSIX (то есть не в Windowsподсказка), вы можете использовать пример кода со страницы Python для модуля termios , чтобы получить пароль, не отображая его на экране:
def getpass(prompt="Password: "):
import termios, sys
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ECHO # lflags
try:
termios.tcsetattr(fd, termios.TCSADRAIN, new)
passwd = raw_input(prompt)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
return passwd
Это не ставит *
для персонажей;это просто подавляет ввод.Чтобы поставить *
, вам нужно обрабатывать ввод по одному символу за раз и писать больше кода.