我正在开发一个小型 uni 项目,其中我有一个使用 tkinter 模块的 Python 中单个用户的程序。我想创建一个屏幕,要求他们输入密码。我不确定如何执行此操作以及将密码存储在哪里?
我没有数据库经验,但我听说过 MD5 和 SHA256,我正在考虑将散列或加密密码写入文本文件,然后读取它,但我不确定这是否安全。
密码功能是为了防止其他人查看用户的个人日记条目。
我正在开发一个小型 uni 项目,其中我有一个使用 tkinter 模块的 Python 中单个用户的程序。我想创建一个屏幕,要求他们输入密码。我不确定如何执行此操作以及将密码存储在哪里?
我没有数据库经验,但我听说过 MD5 和 SHA256,我正在考虑将散列或加密密码写入文本文件,然后读取它,但我不确定这是否安全。
密码功能是为了防止其他人查看用户的个人日记条目。
这个答案采取了最简单的方法来实现安全措施。@JFSebastian 在评论中指出,您绝对可以探索更强大的安全程序和更大的加密,但这真的取决于您的需求
如果您的目标只是试验和创建概念验证登录系统,则可以使用加密 + 平面文件的方法。对于存储密码,您可能只需要 SHA1,因为您要加密的是密码的变体,而不是敏感数据本身。我的意思是你不关心数据本身。您只关心比较加密结果...
首先,您将选择一个秘密字符集作为“盐”。不幸的是,您使用的是未编译的语言,因此您的 salt 可能会存在于您的程序中。但至少密码文件本身是不可用的。(“salt”在这里用作您唯一的秘密值。在更安全的方法中,秘密将是在密码+盐的散列之外使用的单独密钥)
import hashlib
salt = "-WOu@p.Za,>W+6&`A63/"
user_password = "password"
sha1 = hashlib.sha1()
sha1.update(user_password + salt)
encrypted = sha1.hexdigest()
print encrypted
# 476dc4076d1c7eb43152b78e9dc20d892f660f24
您可以将该加密的 sha1 值存储到文件中。如果没有秘密的盐值,它对任何人都没有用。您要做的就是在用户进行身份验证时使用此值与未来的 sha1 值进行比较
test_sha1 = hashlib.sha1(raw_input("Enter password: ") + salt).hexdigest()
# Enter password: password
print encrypted == test_sha1
# True
你永远不会真正知道他们的密码。您只知道从它派生的 sha1 值加上盐。可以把它想象成两个守卫,每个人都需要提供一把钥匙,同时转动,打开保险库。
否则......您可以将其与盐值一起存储在数据库中。该过程仍然是相同的,但您将盐移动到一个更安全的位置,这需要 auth 甚至查询它。不管怎样,你的盐秘诀是最珍贵的财产。
解决 SHA256... 需要更强大的加密算法来以需要保护的有形格式存储真实数据(或为密码创建较慢的散列过程以使暴力破解需要更长时间才能完成)。例如,如果您决定存储用户的私人日记条目,您可能会针对他们的密码进行加密,并且仅将这种加密格式存储在磁盘或数据库中。当用户进行身份验证时,您可以通过他们的密码向他们提供解密的数据。您永远不会存储密码,因此即使您作为软件的作者也无法在没有原始密码的情况下访问他们的数据。
Again, as @J.F.Sebastian points out, the more robust approach would be using a bcrypt library: http://www.mindrot.org/projects/py-bcrypt/