如何通过PyNaCl处理密码管理?

2024-09-30 14:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下情况:

给定一个Python应用程序在某个客户机上支持多个用户。它加密和解密用户密码。目前最值得推荐的方法是什么?在

尝试使用PyNaCl会导致这样一种认识:由于PyNaCl用于通信加密和解密,这不是一种好方法。这里我们有密码,这些密码应该被加密,存储到一个文件中,然后根据请求解密(例如,如果一个特定的用户想要重新登录)。在数据库中存储密码对于我们当前的实验来说不是一个选择(尽管这可能是一个更好的解决方案)。在

根据您的经验:如何处理从文本文件等加密和解密用户数据的问题?(再次说明:这是试验性的,在现阶段不适用于生产性用途)


Tags: 文件数据方法用户数据库应用程序密码客户机
2条回答

PyNaCl支持多种类型的加密原语,但密码哈希方案不是其中任何一种。在

使用加密来存储密码是一种反模式。用来解密加密密码的密钥存储在哪里?如果密钥存储在代码或文件系统的某个文件中,那么整个过程只不过是混淆。如果钥匙丢了怎么办?攻击者可以直接解密密码并登录。
我假设用户实际上并不是键入密钥,而是输入密码。如果他们输入密钥,那么这些密钥就可以直接用于PyNaCl加密。

相反,密码应该反复散列并存储散列。如果用户试图再次登录,密码将再次使用相同的参数(salt、迭代计数、成本因子)进行哈希运算,并与存储的值进行比较。这是客户机-服务器应用程序中常见的解决方法,但不必在任何地方存储密码哈希,因为PyNaCl的对称加密还提供了身份验证(完整性)。这意味着您可以通过从中派生密钥并尝试解密容器来检测错误的密码。当PyNaCl产生错误(或者容器被篡改)时,密码是错误的。在

有多种方案(PBKDF2、bcrypt、scrypt、Argon2)可用于此目的,但PyNaCl中没有一个方案。不过,潜在的lib钠支持其中两种。在

以防有人无意中发现这个问题:从1.2.0版开始,PyNaCl支持使用argon2i和argon2id进行密码散列 模块是nacl.pwhash

相关问题 更多 >