Имена и пароли Python - PullRequest
       16

Имена и пароли Python

3 голосов
/ 19 декабря 2010

Я пытаюсь создать программу, в которой вы можете создавать, входить в систему и удалять учетные записи. Я сделал 2 списка, один с именами пользователей и один с паролями. Сценарий запрашивает ввод и, если вы говорите «войти», он говорит:

if loginchoice=='login':
    choice = raw_input("What is your username? ")
    choice2 = raw_input("What is your password? ")
    if choice in accounts:
        option1=1
    else:
        option1=0
    if choice2 in password:
        option2=1
    else:
        option2=0
    if option1==1 and option2==1:
        print "Welcome to Telemology,", choice
    else:
        print "The username or password you entered is incorrect. Please try again or register."

Как видите, он только проверяет, есть ли входы в списках. Он не видит, имеют ли входы одинаковый индекс. Я не могу поставить «account.index (choice)», потому что он рассматривает «choice» как целое число. То же самое касается цитат из-за строк. Он не рассматривает их как переменные. Есть ли способ обойти это?

Я надеюсь, что, если на мой вопрос ответят, два человека не будут регистрироваться одновременно и сбивать показатели.

Ответы [ 9 ]

2 голосов
/ 19 ноября 2016

Вы должны использовать модуль getpass, чтобы гарантировать, что пароль не отображается на экране, а модуль hashlib означает, что необработанный пароль не сохраняется.Вот класс, который использует оба модуля и должен работать на python2 и python3.Если вы хотите загрузить его из файла, вам следует сохранить в нем атрибут UserDB.users, для этого можно использовать модуль json.

import getpass
import hashlib
import random
import sys
class UserDB():
    def __init__(self, users=dict(), unprompt='Username:', pwprompt='Password:'):
        self.users=dict(users)
        self.unprompt=unprompt
        self.pwprompt=pwprompt
    def adduser(self):
        if sys.version_info.major==3:
            name=input(self.unprompt)
        elif sys.version_info.major==2:
            name=raw_input(self.unprompt)
        passwd=getpass.getpass(self.pwprompt).encode('utf-8')
        salt=bytes(random.randint(30, 95) for i in range(10))
        passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
        self.users[name]=[salt, passwd]
    def deluser(self, name):
        del self.users[name]
    def __str__(self):
        return str(self.users)
    def __repr__(self):
        return 'UserDB(users=%s, unprompt=%s, pwprompt=%s)' % (self.users,
                                                           ascii(self.unprompt),
                                                           ascii(self.pwprompt))
    def login(self):
        if sys.version_info.major==3:
            name=input(self.unprompt)
        elif sys.version_info.major==2:
            name=raw_input(self.unprompt)
        if name not in self.users:
            return False
        passwd=getpass.getpass(self.pwprompt).encode('utf-8')
        salt=self.users[name][0]
        passwd=hashlib.pbkdf2_hmac('sha512', passwd, salt, 10*10)
        return self.users[name][1]==passwd
2 голосов
/ 19 декабря 2010

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

users = {} # this is the mapping
users["joe"] = "123" # it currently contains username "joe" with password "123"
...
username = raw_input("What is your username? ")
password = raw_input("What is your password? ")
if username in users.keys():
  expected_password = users[username]
  if expected_password == password:
    print "Welcome to Telemology,", username
  else:
    print "Didn't you forget your password,", username
else:
  print "Unknown user"

Конечно, в реальной системе вы храните зашифрованные и зашифрованные пароли.

1 голос
/ 09 февраля 2013

У меня есть очень простой код, который позволяет два пароля на ваш пароль, если они не совпадают, не будет работать

    users = {}
users["bob"] = "bob" 

username = raw_input("What is your username? ")
password = raw_input("What is your password? ")
if username in users.keys():
  expected_password = users[username]
  if expected_password == password:
    print "Welcome to Telemology,", username
  else:
    print "Didn't you forget your password,", username

password = raw_input("What is your password? ")
if username in users.keys():
  expected_password = users["bob"]
  if expected_password == password:
    print "Welcome to Telemology,", username
    #*here
  else:
    print "Didn't you forget your password,", username
else:
  print "Unknown user"
#continue your code for wrong here else*
1 голос
/ 19 декабря 2010

Некоторые проблемы, с которыми я сталкиваюсь:

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

Я не нашел переносимого способа не отображать пароли.# 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

Это не ставит *для персонажей;это просто подавляет ввод.Чтобы поставить *, вам нужно обрабатывать ввод по одному символу за раз и писать больше кода.

1 голос
/ 19 декабря 2010

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

Наличие двух списков рано или поздно будет десинхронизировано.

1 голос
/ 19 декабря 2010

Поскольку это login, оно должно быть уникальным, и вы можете создать словарь:

users = {'username':'password', ...}

, а затем проверить следующее:

choice = raw_input("What is your username? ")
choice2 = raw_input("What is your password? ")
if (choice in users) and (choice2 == users[choice]):
   # valid user
else:
   # login or password incorrect.
0 голосов
/ 14 мая 2017

Вы должны изменить ввод пароля на целое число следующим образом:

password = raw_input("What is your password? ") --->this is your code
password = int(input("what is your password?")) --->modified code

и тогда все должно работать.

0 голосов
/ 29 августа 2015

Вы всегда можете создать словарь с именами учетных записей и соответствующими им паролями. dictionary={'username':'password','some other username':'some other password'} if dictionary[choice] == choice2: print 'Welcome to Telemology, %s' %choice

0 голосов
/ 20 декабря 2010

Или вы можете просто SQLite3 дБ. Это позволит вам добавлять пользователей и пароль во время выполнения. SQLite3 также обеспечивает хеширование.

...