首先,上下文:我正在尝试创建一个需要登录的基于命令行的工具(Linux)。此工具上的帐户与系统级帐户无关——这些都与 /etc/passwd 无关。
我计划使用与 /etc/passwd 相同的格式(大致)将用户帐户存储在文本文件中。
尽管不使用系统级密码文件,但与以明文形式存储密码相比,使用 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”),但这对于攻击者来说似乎比使用每个用户用户名中的两个字符要少。