所以在我明年开始学习AS级计算机科学之前,我将在今年夏天做一些练习。
这是一款需要使用用户名和密码登录的游戏,然后需要存储用户分数。
最初我只是要以每个用户命名的.txt文件,第一行是明文密码,程序在登录时读取。为了保存分数,我将原始分数附加到文档末尾的新行。
现在我考虑一下,我想知道是否更好更整洁有一个.csv文件并保存第一列中每个用户的所有用户名,然后是第二列上的盐渍和散列密码,与用户位于同一行(主要是因为我觉得这很有意思,想学习它,而不是我的程序是必要的)然后每个分数都有下一行。
我真的不知道如何检查第一列以查找是否存在与用户尝试输入相同的用户名,那么我将如何将输入的密码与同一行中的密码进行比较
一栏任何建议都将受到高度赞赏,但与此同时我会尝试解决它(毕竟你应该“代码学习,而不是学习代码”) 如果我到达的话,我会回复
提前感谢任何帮助:) 亚历
答案 0 :(得分:0)
我认为csv不是在Python中存储密码的正确格式。用json怎么样?
我写了一些包含一些dict
的示例,并将其内容存储到json文件中:
import codecs
import crypt
import hmac
import json
import os
class Secret:
def __init__(self, filename='passwords.json'):
self.filename = filename
self.content = self.read_file()
def read_file(self):
if os.path.exists(self.filename):
with codecs.open(self.filename, 'r', encoding='utf-8') as rf:
return json.loads(rf.read())
# create defaults if file does not exist
return dict(
salt=crypt.mksalt(),
users=dict()
)
def write_file(self):
with codecs.open(self.filename, 'w', encoding='utf-8') as wf:
return wf.write(json.dumps(self.content, sort_keys=True, indent=4))
def set_user_password(self, name, password):
self.content['users'][name] = crypt.crypt(name, password)
self.write_file()
def check_user_password(self, name, password):
if name in self.content['users']:
hashed = self.content['users'][name]
if hmac.compare_digest(hashed, crypt.crypt(name, password)):
return True
return False
请注意:
这个例子是盲目地基于crypt-module的文档 - 我不知道这是否安全(可能不是)。 进一步:我不知道将盐与密码一起存储是否合适。
你可以像这样使用它:
if __name__ == '__main__':
secret = Secret(filename='passwords.json')
secret.set_user_password('demo_user', 'lolcat')
for user, password in [
('demo_user', 'lolcat'),
('demo_user', 'wrong_pass'),
('wrong_user', 'wrong_pass'),
]:
print(
'user:', user, 'password:', password,
'\n-->', secret.check_user_password(user, password)
)
它创建一个像这样的json-File:
{
"salt": "rT",
"users": {
"demo_user": "lo1JY.PCooh4."
}
}