<p>首先,请阅读<a href="https://security.stackexchange.com/a/31846/39623">Thomas Pornin's canonical answer to How to securely hash passwords</a>。这将回答你关于“盐”是什么的问题。</p>
<p>第二,密码是一种古老的算法-不要使用它。即使是基于Python SHA-512的crypt也可能无法使用,因为您无法控制迭代次数(BCrypt可能称之为工作因子),因此您无法通过增加迭代次数来使其更安全。</p>
<p>第三,<a href="https://docs.python.org/3.5/library/hashlib.html" rel="nofollow">Python as of 3.4 has fast PBKDF2 based on OpenSSL built in</a>。</p>
<p><a href="https://docs.python.org/2.7/library/hashlib.html" rel="nofollow">Python 2.7.8</a>也是。</p>
<p>这两种方法都支持在hashlib中构建合理的哈希类型!用这些来代替!如何使用这些工具的一个例子如下:</p>
<pre><code>import hashlib
BinaryOutput = hashlib.pbkdf2_hmac('sha512',password, salt, args.iterations, args.outputBytes)
</code></pre>
<p>其中</p>
<ul>
<li><p>args.iterations在低位数十万到高位数万之间</p></li>
<li><p>假设使用的是SHA-512,那么args.outputBytes不超过64个(其他算法更少),并且不少于20个。</p></li>
<li><p>将迭代次数存储在cleartext中(无论是硬编码的、文件中的还是数据库中的),这样以后就可以很容易地使它变大。</p></li>
<li><p>为了得到salt,您应该生成至少12个(最好是至少16个)加密随机字节。对每个用户名使用不同的salt,并将其存储在存储中的明文中(无论是硬编码的、文件中还是数据库中)。</p></li>
</ul>
<p>使用PBKDF2-HMAC-SHA-512使用64位操作,这会降低基于GPU的攻击者对您的优势。</p>
<p>如果您担心定时攻击,可以使用各种恒定时间比较之一。一个与高迭代PBKDF2-HMAC-SHA-512相比不需要花费太多的东西是这样的:</p>
<pre><code>if hashlib.sha256(args.expectedBinary).hexdigest() == hashlib.sha256(BinaryOutput).hexdigest():
</code></pre>