擅长:python、mysql、java
<p>PyNaCl支持多种类型的加密原语,但密码哈希方案不是其中任何一种。在</p>
<p>使用加密来存储密码是一种反模式。用来解密加密密码的密钥存储在哪里?如果密钥存储在代码或文件系统的某个文件中,那么整个过程只不过是混淆。如果钥匙丢了怎么办?攻击者可以直接解密密码并登录。<br/>
<sup>我假设用户实际上并不是键入密钥,而是输入密码。如果他们输入密钥,那么这些密钥就可以直接用于PyNaCl加密。</sup></p>
<p>相反,密码应该反复散列并存储散列。如果用户试图再次登录,密码将再次使用相同的参数(salt、迭代计数、成本因子)进行哈希运算,并与存储的值进行比较。这是客户机-服务器应用程序中常见的解决方法,但不必在任何地方存储密码哈希,因为PyNaCl的对称加密还提供了身份验证(完整性)。这意味着您可以通过从中派生密钥并尝试解密容器来检测错误的密码。当PyNaCl产生错误(或者容器被篡改)时,密码是错误的。在</p>
<p>有多种方案(PBKDF2、bcrypt、scrypt、Argon2)可用于此目的,但PyNaCl中没有一个方案。不过,潜在的lib钠支持其中两种。在</p>