一种独特的盐解决了一个问题——一个巨大的蛮力尝试不能同时攻击每个帐户。
假设您尝试构建一个包含 8 个字符长1的所有可打印 ASCII 密码的彩虹表。那是 96 8 ~ 720 亿 (7.2 x 10 15 ) 的可能性。如果您的 GPU 以每秒 10 亿的速度生成密码,那么破解大约需要一个月左右的时间(在 200W 的情况下,每千瓦时 0.10 美元,平均约为 200 美元;最坏的情况是您的电费约为 400 美元)。
因此,您可以通过某种 SQL 注入或查找带有旧备份的硬盘驱动器来找出linkedin 上每个帐户的哈希值。你有一百万个用户的哈希值。现在,如果它们是未加盐的哈希,您可以在两个月内用一个 GPU 破解这些哈希中的绝大多数,而电费约为 400 美元。如果它们都是唯一盐渍的,并且你想打破所有这些盐,那么现在将需要 4 亿美元的电力,因为每个独特的盐都必须有自己的独立攻击。现在在你说之前,我将构建一个更大的包含盐的彩虹表,请意识到典型的盐至少有 5 个十六进制字符(16**5),这意味着创建彩虹需要一百万倍的时间表(例如,您需要在电力上花费 4 亿美元来发电)。
现在添加密钥强化,而不是进行一次哈希,而是迭代过程 N 次(例如,三次迭代的哈希函数将是:)hash(salt+hash(salt+hash(salt+pw)))
。现在,他们无法每秒破解十亿个哈希值,而是每秒破解十亿个/N个哈希值,因此所有攻击的成本都将增加 N 倍。(典型的 N 是 5000;因此破解单个哈希将花费大约 200 万美元的电力;超大 N 的问题在于它在您的服务器上用于验证密码尝试的计算资源更多)。
1 - 这不是破解密码的最有效方法。数百万个以前使用过的密码的字典列表更有效,因为许多密码都很弱。我不建议人们自己生成密码(通常熵非常低)或重复使用密码。使用 keepassx 之类的服务,它允许您为每个站点创建随机密码并存储在加密文件中。密钥强化+独特的盐意味着除了最简单的哈希之外,尝试破解任何东西都是不可行的。