【问题标题】:python3 - storing username & hashed password in a .csvpython3 - 将用户名和哈希密码存储在 .csv 中
【发布时间】:2016-07-08 14:40:21
【问题描述】:

所以在我明年开始学习 AS 级计算机科学之前,我有一个暑假要做的练习任务。

这是一个需要用用户名和密码登录,然后需要存储用户分数的游戏。

最初我只是想要一个以每个用户命名的 .txt 文件,第一行是明文密码,程序在登录期间读取该密码。为了保存分数,我打算将原始分数附加到文档末尾的新行中。

现在我想一想,我想知道如果有一个 .csv 文件并将每个用户的所有用户名保存在第一列中,然后在第二列中保存一个加盐和散列的密码,是否会更好更整洁,与用户通过在同一行中(主要是因为我认为这很有趣并且想学习它,而不是我的程序需要它)然后获得下一行的每个分数。

我真的不知道如何检查第一列以查找是否存在与用户尝试输入的用户名相同的用户名,然后我将如何将输入的密码与同一行中的密码进行比较但是一栏

任何建议都将不胜感激,但同时我会尝试弄清楚(毕竟你应该“学习编码,而不是学习编码”) 如果我到达任何地方,我会回帖

提前感谢您的帮助:) 亚历克斯

【问题讨论】:

  • 数据库怎么样?您可以使用内置的sqlite。 (顺便说一句,这似乎是一个工具/场外资源推荐,这是题外话。)
  • 我一定会看看它,但是上次我尝试使用 SQL 来为自己处理复杂的事情:P
  • 您可以尝试github.com/jaraco/keyring 之类的安全密码存储。

标签: python-3.x csv


【解决方案1】:

我认为 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 文件:

{
    "salt": "rT",
    "users": {
        "demo_user": "lo1JY.PCooh4."
    }
}

【讨论】:

  • 非常感谢您的输入,最后我选择只使用 txt 文件,因为这样做更容易。由于这只是夏天的练习,密码存储不需要安全,但我发现对密码进行哈希处理很有趣。如果您有兴趣,这是最后的游戏(它很笨重,但它很有效,我相信我会在接下来的几周内改进它):code
猜你喜欢
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
相关资源
最近更新 更多