我计划使用与 /etc/passwd 大致相同的格式将用户帐户存储在文本文件中。
尽管不使用系统级密码文件,但使用 crypt 似乎是一种好的做法,而不是以明文形式存储密码。(虽然 crypt 肯定比以明文形式存储密码更好,但我也可以接受其他方法。)
我的 crypt 知识基于这个: https://docs.python.org/2/library/crypt.html 文档似乎要求一些不可能的事情:“建议在检查密码时使用完整的加密密码作为盐。”
什么?如果我正在创建加密密码(例如,在创建用户记录时),如何使用加密密码作为盐?它还不存在。(我假设您必须在创建和检查密码时使用相同的盐。)
我尝试使用明文密码作为盐值。这个方法可行,但有两个问题:一个很容易解决,一个比较严重:
1) 密码的前两个字符会被包含在加密后的密码中。你可以通过不将前两个字符写入文件来解决这个问题:
user_record = '%s:%s:%s' % (user_name, crypted_pw[2:], user_type)
2) 通过使用明文密码作为盐值,似乎会降低系统中的熵量。也许我误解了盐的目的。
我能够得出的最佳做法是使用用户名的前两个字符作为盐值。这样做是否合适,还是我忽略了什么问题?
我理解盐的作用是防止从字典中预先计算密码哈希值。我可以为所有密码使用标准盐值(例如我的缩写“JS”),但这似乎对攻击者来说不如使用每个用户用户名的两个字符那样困难。