只是解决另一个答案(cpast's),关于何时使用一个或另一个来管理密码:
这实际上是完全没用的。攻击者不必遵守你的规则。当攻击者拥有哈希的副本时,哈希需要保护密码。如果攻击者可以快速计算散列,那么计算它们的速度有多慢并不重要。哈希需要天生很慢;不应该有比合法服务器更快地评估它们的捷径。
sha256sum(sha256sum(sha256sum.....(salt + master password)))...
多次应用散列确实增加了攻击者试图从散列中检索密码的难度,并且确实使密码推导函数本质上变慢了。攻击者每次尝试都需要遍历每一个 SHA256 函数。
这将使其与其他密钥派生算法一样慢(甚至更慢/更难)。
密码算法通常对密钥做出某些假设;除其他外,他们通常假设它是从一组可能的密钥中完全随机选择的。密钥也应该有一定的长度;它们的推导函数需要任意长度的输出。相反,如果密码散列的输出具有很多结构,那就没问题了。也许有 70% 的机会相邻位具有相同的值。也许它将 128 位熵传播到 4096 位输出中。只要难以逆转,那是一个很好的哈希,但它不适合作为密钥。
只运行一次 SHA256 将产生看似从整数集中随机选择的输出,最大为2 256。2 256是一个天文数字,截断它允许用户在不损失安全性的情况下对任意长度的输出进行采样(当然,只要他们采样足够的熵)。
SHA256 函数可能存在“大量输出结构”而损害生成的密码的可能性微乎其微。即便如此,如果攻击者想要破解散列输出,没有比猜测随机数更好的策略(即使尝试也是徒劳的)。