1

假设我正在设计一个具有适度安全要求的 Web 服务。在大多数情况下,威胁模型更多的是关于无聊的大学生,而不是你在间谍小说中找到的任何东西。使用以下密码存储方案实际上会有什么问题吗?

盐 || 哈希(网站 || 密码 || 盐)

其中site是我的站点的唯一标识符,password是用户密码,salt是用户特定的随机salt,hash是通用的加密散列函数,如SHA-1,|| 表示串联。

我知道这个计划带来的某些问题。

  • 哈希(设计为)可以快速评估,并且一次迭代会使特定的弱密码变得可猜测。

  • 单独的连接可能会导致哈希的整体输入中出现“双关语”。

现在,Internet 上的某些安全专家会让我相信,如果这是我对一个足够好的密码散列方案的想法,我不可能配得上工作,并且迫切需要重返学校。他们指出,从安全角度来看,有一些众所周知的密码散列方案具有更好的特性。他们要求我改用更好的东西。

但真的,我应该吗?我在这里有一点反驳的论点。

  • 这可能不会是我服务中最薄弱的环节。真正决心闯入的人还有很多其他途径,我应该优先安排时间来保护较弱的途径。

  • 如果我的网站没有什么内在价值,那么成本效益已经对攻击者不利。大型集群/僵尸网络可以在一天/一周内恢复弱密码,这有多大实际问题?那天/那一周肯定有更有价值的事情要做。

  • 由于特洛伊木马、键盘记录程序、社会工程攻击等,更有可能发生被盗帐户。技术并不是这种安全性的限制因素。

  • 我的方案越复杂,移动/扩展到另一个平台可能就越困难。如果我使用 bcrypt(假设),我可能必须编写一个 bcrypt 包装器并将其合并。

我真的很喜欢这个方案。这真的很简单。实施很难出错。我会争辩说,就普通网站而言,出于所有意图和目的,它应该没问题。要求我采用更好的散列方案几乎听起来像是要求我在已经很容易受到电锯伤害的门上安装更大的锁。

如果我在这里做错了什么,我将非常感谢有人指出这一点,特别是在实际和现实世界适用的问题方面。

谢谢。

4

2 回答 2

2

请参阅如果可以访问数据库,盐和散列的意义何在?

盐可以防止(某些)彩虹表攻击,但它们不能防止字典或蛮力攻击。

改用Scryptbcrypt,其中 Scrypt 更强大,但两者都使用工作证明系统,使破解密码变得更加困难。请参阅OWASP 密码存储备忘单

于 2011-08-20T22:01:32.100 回答
0

从纯哈希的角度来看,除非我读错了您的问题,否则您建议创建与用户特定随机盐连接的密码哈希,这是通常的方法。如果您已经获得了足够长度的加密随机强盐,则连接中涉及的任何其他数据都不会产生很大的不同。

然后是关于哪种散列算法最安全的老争论,当然 bcrypt 将胜过 SHA 之类的算法——尤其是 MD5——因为它具有自适应性,并且能够增加散列过程持续时间以抵御暴力攻击。

但是,您可以务实地争辩说,对于大多数通用网站案例,SHA1 及更高版本就足够了。当您查看我们最近看到的违规行为时,密码泄露通常发生在它们以纯文本形式存储(显然非常容易受到攻击)或没有盐的散列(容易受到彩虹表的攻击)的情况下。当然,SHA 衍生物的工作速度会更快(特别是如果它是单个哈希),但与加密随机盐相结合,这不是一项小任务。

恰当的例子:Microsoft 的 ASP.NET 成员资格提供程序使用 SHA1,并且使用非常广泛。没有本机 bcrypt 支持(尽管有第三方库可用),这可能应该告诉您有关 Microsoft 如何看待该问题的一些信息。

最后,还有密码强度的问题。设置一个长而强的要求显然会增强哈希对抗许多蛮力技术的强度。当然存在可用性权衡,但这是另一个问题。

于 2011-08-21T01:27:42.750 回答