我有以下情况:
在某个客户端计算机上给出了一个Python应用程序,可以启用多个用户它加密和解密用户密码。目前推荐的方法是什么?
使用PyNaCl的尝试导致了这一观点,即由于PyNaCl用于通信加密和解密这不是一个好方法。这里我们有密码,这些密码应加密,存储到文件中,然后根据请求进行解密(例如,如果特定用户想要重新登录)。将密码存储在数据库中对于我们当前的实验不是一种选择(尽管它可能是更好的解决方案)。
根据您的经验:从例如加密和解密用户数据这个问题的好方法是什么?文字文件? (同样:这是实验性的,不适用于当前阶段的生产用途)
答案 0 :(得分:1)
PyNaCl支持多种类型的加密原语,但密码散列方案不是它们。
使用加密进行密码存储是一种反模式。存储密钥在哪里解密加密密码?如果密钥存储在代码中的某个位置或文件系统中的某个文件中,那么整个事情只不过是混淆。如果密钥丢失怎么办?攻击者可以直接解密密码并登录 我假设用户实际上并未输入密钥,而是输入密码。如果他们输入密钥,那么这些密钥可以直接用于PyNaCl加密。
相反,应重复对密码进行哈希处理并存储哈希值。如果用户尝试再次登录,则使用相同的参数(盐,迭代计数,成本因子)再次对密码进行哈希处理,并与存储的值进行比较。这是它在客户端 - 服务器应用程序中通常解决的方式,但没有必要在任何地方存储密码哈希,因为PyNaCl的对称加密还提供身份验证(完整性)。这意味着您可以通过从中获取密钥并尝试解密容器来检测错误的密码。 PyNaCl产生错误(或容器被篡改)时密码错误。
有多种方案(PBKDF2,bcrypt,scrypt,Argon2)可用于此目的,但它们都不包含在PyNaCl中。虽然,底层的libsodium支持其中两个。
答案 1 :(得分:1)
万一有人偶然发现此问题:PyNaCl自版本1.2.0起使用argon2i和argon2id支持密码哈希处理 模块是nacl.pwhash