好的,所以哈希的整个问题是用户输入的密码长度不能超过 15 个字符。大多数只使用 4-8 个字符,使攻击者很容易用彩虹表破解它们。
解决方案,使用用户 salt 使哈希输入更复杂,超过 50 个字符,这样他们就永远无法生成表(对于这种大小的字符串来说太大了)。另外,他们必须为每个用户创建一个新表。问题:如果他们下载数据库,他们将获得用户盐,所以如果他们足够关心,你就会回到第一方。
解决方案,使用站点“pepper”加上用户盐,那么即使他们获得了数据库,他们仍然必须知道配置文件。问题:如果他们可以进入您的数据库,他们也可能会进入您的文件系统并发现您的站点。
因此,在所有这些已知的情况下 - 让我们假设攻击者进入您的网站并获得一切,一切。那你现在怎么办?
在讨论的这一点上,大多数人的回答是“谁在乎这一点?”。但这只是一种廉价的说法,“我不知道下一步该做什么,所以它不可能那么重要”。可悲的是,我在其他任何地方都问过这个问题,这就是答案。这表明大多数程序员错过了一个非常重要的点。
让我们想象您的网站与其他 95% 的网站一样,并且用户数据——甚至是完全服务器访问权限——不值得蹲下。攻击者碰巧在追捕您的一位用户“Bob”,因为他知道“Bob”在您的网站上使用的密码与他在银行网站上使用的密码相同。他也碰巧知道鲍勃在那里有他毕生的积蓄。现在,如果攻击者可以破解我们网站的哈希值,那么剩下的就是小菜一碟了。
所以这是我的问题——如何在没有任何可追踪路径的情况下延长密码的长度?或者您如何使散列过程变得复杂以便及时复制?我想出的唯一一件事是您可以重新散列哈希数千次,并将创建最终彩虹表所需的时间增加 1,000 倍。这是因为攻击者在创建表时必须遵循相同的路径。
还有其他想法吗?