<p>您应该使用getpass模块来确保密码不会回显到屏幕上,使用hashlib模块来表示原始密码不会被存储。这是一个同时使用这两个模块的类,应该在python2和python3上工作。如果要将其从文件中加载,则应将UserDB.users属性存储在文件中,可以使用json模块来执行此操作。</p>
<pre><code>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
</code></pre>