这个概念是完全有道理的:实际上,很多人都提出过这个概念,但正确实现它却很困难。如果你做错了,会遇到很多问题,其中最直接的问题是易受"pass-the-hash"攻击,正如@swa66所描述的那样。为了防止这种情况的发生,你需要在两端进行哈希处理。客户端哈希应该是慢速的(bcrypt、scrypt、argon2或pbkdf2),而服务器端哈希应该是快速的(sha256)。
编辑: 很多人在不理解这个方法的情况下就对此进行了负面评价,因此我在这里提供基本详细信息(之前我只提供了如何操作的链接)。这个想法是在客户端应用一个慢速哈希算法,例如bcrypt,然后在服务器端应用一个快速哈希算法,例如SHA256。 快速哈希算法是必需的,以防止"pass-the-hash"攻击。 在数据库泄漏的情况下,攻击者要么需要反转快速哈希(不可能—违反了密码哈希函数的单向属性),要么需要暴力破解快速哈希的原像(不可能—其大小等于慢速哈希输出的长度,例如bcrypt的输出为184位),要么需要暴力破解慢速哈希和快速哈希的组合—这会使攻击者回到与整个计算都在服务器端进行相同的位置。因此,通过将重量级的计算转移到客户端,我们并没有在数据库泄漏的情况下降低密码攻击的安全性。
我曾经调查过一些类似于这样的提案,详情请参见 《保护Web应用程序数据库中密码的方法》。此外,我还分析了其优缺点,并发现了以前未被发现的弱点(账户枚举),并提出了一种独特的安全方法。该研究基于多个来源,包括:你引用了 Twitter 的例子,GitHub 也做了类似的事情。当我撰写上述论文时,最显著的防止服务器看到明文密码的例子是 Heartbleed,我在论文中对此进行了评论(请参见第 1.3 节底部)。
其他人后续进行了类似的研究,发现了相似的思想--例如:客户端加服务器密码哈希作为一种潜在的改进安全性的方法,可以防止暴力攻击而不会过载服务器。没有一个人应该获得全部荣誉,但主要的结论是:如果你安全地实施,这确实是个好主意,但你真的需要了解风险(如果你没有阅读研究,则很容易不安全地实施)。
不行!
密码学的第一条规则:不要自己发明,否则你会犯下可怕的错误。
这并不是针对你个人的,远非如此:即使顶尖专家在精心设计新系统时也会犯错。这就是为什么他们在任何东西成为标准之前都要进行多次同行评审。许多这样的专家提出的标准建议由于同行评审期间发现的问题而被重新制定。那么为什么我们其他普通人不能设计:因为没有人足够优秀来进行同行评审,而专家也不会碰它。
在客户端哈希密码
在客户端哈希真的很糟糕,因为哈希变成了密码,现在你将其以明文形式存储在服务器上。
如何处理密码
使用慢哈希。使用快哈希是常见且致命的错误,即使使用盐也是如此。大多数人知道的哈希函数,例如SHA-256、SHA-3等都是快哈希,完全不适合哈希短、可预测的项目,例如密码,因为它们可以在惊人的短时间内被反转。
有多慢:尽可能慢。慢哈希的示例: bcrypt、PBKDF-2(本质上是高轮次的快哈希,使其变慢)
根据您的编程环境,可能会有预先制作的例程,请使用它们!
参考:
是的,除了服务器端哈希之外,在客户端也进行哈希处理是有意义的。然而,与保护服务器的服务器端哈希相比,客户端哈希是保护用户而不是服务器的东西。客户端哈希的整个重点在于许多用户在其他网站上重复使用他们的密码,因此客户端哈希可以帮助保护这些密码。因此,客户端哈希永远不能替代服务器端哈希,但实施它作为服务器端哈希的补充是有意义的。我认为客户端哈希有几个有用的点: