Python用户名和密码

时间:2010-12-19 18:12:30

标签: python passwords indexing username

我正在尝试创建一个程序,您可以在其中创建,登录和删除帐户。我制作了两个列表,一个是用户名,另一个是密码。脚本要求输入,如果你说登录,它会说:

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."

如您所见,它只检查输入是否已在列表中。它不会看输入是否具有相同的索引。我不能把“accounts.index(choice)”,因为它将'choice'视为一个整数。由于字符串,引用也是如此。它不会将它们视为变量。有没有办法解决这个问题?

我希望如果我的问题得到解答,两个人就不会同时注册并且会使指数出现故障。

9 个答案:

答案 0 :(得分:2)

您想要的是地图或字典。它的关键是用户名,其内容是该用户名的密码。

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 :(得分:2)

您应该使用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 :(得分:1)

因为它是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.

答案 3 :(得分:1)

改为创建一个用户列表,并创建用户对象,其中包含用户名和密码作为属性。

有两个列表迟早会被取消同步。

答案 4 :(得分:1)

我看到的一些问题:

  1. 您正在显示用户键入的密码。
  2. 您将接受任何用户名和密码,这意味着我可以使用我的密码登录任何帐户。
  3. 绝不存储明文密码。
  4. 我还没有找到不回显密码的便携方法。 #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页面中的一些示例代码{{3模块获取密码而不将其回显到屏幕:

    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
    

    这不会让*为字符;它只是压制输入。要设置*,你必须一次处理一个字符输入并编写更多代码。

答案 5 :(得分:1)

我有一个非常简单的代码,如果你的密码不匹配就可以两次尝试密码

    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*

答案 6 :(得分:0)

或者你可以只使用SQLite3 db。这将允许您在运行时添加用户和密码。 SQLite3还提供散列本身。

答案 7 :(得分:0)

您始终可以使用帐户名称及其各自的密码创建字典。 dictionary={'username':'password','some other username':'some other password'} if dictionary[choice] == choice2: print 'Welcome to Telemology, %s' %choice

答案 8 :(得分:0)

您应该将密码输入更改为整数,如下所示:

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

然后一切都应该有用。