注意:这不是我目前所处的实际情况。
假设您的老板是那些老式的计算机文盲经理之一,并且希望以明文形式存储密码以简化开发。你有 5 分钟的时间来解释散列密码的意义。你也从经验中知道,你的老板可能会被一个很好的类比所左右。你会用什么类比来解释你的老板密码应该被散列?
注意:这不是我目前所处的实际情况。
假设您的老板是那些老式的计算机文盲经理之一,并且希望以明文形式存储密码以简化开发。你有 5 分钟的时间来解释散列密码的意义。你也从经验中知道,你的老板可能会被一个很好的类比所左右。你会用什么类比来解释你的老板密码应该被散列?
简短的回答是:“所以你不会受到500 万美元的集体诉讼的打击。” 对于大多数 CEO 来说,这应该是足够的理由。散列密码要便宜得多。
但更重要的是:仅按照您在问题中的建议对密码进行哈希处理是不够的。你还是会打官司的。你需要做更多。
为什么你需要做更多需要更长的时间来解释。因此,让我们先走一段漫长的路线,以便您了解您要解释的内容,然后我们将围绕您的 5 分钟概要。
但让我们从那开始。假设您像这样存储用户的密码:
# id:user:password
1:alice:pizza
2:bob:passw0rd
3:carol:baseball
现在,假设攻击者设法获得了比您想要的更多的系统访问权限。在您发现问题并关闭漏洞之前,他只存在 35 秒。但在这 35 秒内,他设法获取了您的密码数据库。是的,你犯了一个安全错误,但你现在已经修复了。你修补了漏洞,修复了代码,更新了你的防火墙,不管它是什么。所以现在一切都很好,对吧?
好吧,不,他有你的密码数据库。
这意味着他现在可以模拟您系统上的每个用户。您系统的安全性被破坏。恢复的唯一方法是使用新密码数据库重新开始,强制每个人更改密码,而不使用他们现有的密码作为有效的身份证明形式。您必须通过其他方式(电话、电子邮件或其他方式)与他们进行带外联系,以验证他们的身份以重新创建他们的密码,与此同时,您的整个操作都陷入了困境。
如果你没有看到他窃取密码数据库怎么办?回想起来,您实际上不太可能看到它发生。您可能发现的方法是注意多个用户帐户上的异常活动。也许几个月来,您的系统似乎根本没有安全性,您无法弄清楚原因。这可能会毁了你的生意。
我们不存储密码,而是存储密码的哈希值。您的数据库现在如下所示:
# id:user:sha1
1:alice:1f6ccd2be75f1cc94a22a773eea8f8aeb5c68217
2:bob:7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53
3:carol:a2c901c8c6dea98958c219f6f2d038c44dc5d362
现在您存储的唯一内容是一个不透明的令牌,可用于验证密码是否正确,但不能用于检索正确的密码。
嗯,差不多。谷歌这些哈希,我敢。
所以现在我们已经发展到 1970 年代的技术。恭喜。我们可以做得更好。
我花了很长时间回答为什么要加盐的问题,包括在现实世界中如何工作的示例和演示。我不会在这里重新讨论散列,所以请继续阅读原文:
挺好玩的吧?好的,所以现在我们知道我们必须对哈希进行加盐,否则我们可能一开始就没有对密码进行哈希处理。现在我们达到了 1990 年代的技术。我们仍然可以做得更好。
您注意到我上面链接的答案底部的那一点,对吗?关于 bcrypt 和 PBKDF2 的那些事儿?是的,事实证明这真的很重要。以今天硬件可以进行散列计算的速度(谢谢你,比特币!),使用现成硬件的攻击者可以在几个小时内破解你的整个加盐、散列密码文件,计算数十亿甚至数万亿每秒哈希。你必须让他们慢下来。
让他们慢下来的最简单方法就是让他们做更多的工作。您必须计算 1000 或 100,000,而不是计算一个哈希值来检查密码。或者任何适合你的数字。你也可以使用scrypt(“ess-crypt”),它不仅需要大量的 CPU 能力,还需要大量的 RAM 来进行计算,这使得我上面链接的专用硬件在很大程度上无用。
这是目前最先进的。祝贺并欢迎来到今天的技术。
那么现在当攻击者获取你的密码文件时会发生什么。好吧,现在他可以离线进行攻击,而不是针对您的服务进行在线猜测尝试。可悲的是,您的大部分用户(4% 到 12%)将使用密码“123456”或“密码”,除非您主动阻止他们这样做,并且攻击者会首先尝试猜测这些密码。
如果你想保证用户的安全,不要让他们使用“密码”作为他们的密码。或其他任何 500 强中的任何一个,就此而言。有软件可以使准确的密码强度计算变得容易(而且免费)。
而且,多因素身份验证从来都不是一个坏电话。您可以轻松添加到任何项目中。所以你也可以。
你在你的老板面前,他问你为什么需要使用 PBKDF2 或类似的东西来散列你的密码。你提到 LinkedIn 的集体诉讼并说:“这是该行业合法预期的最低安全级别。任何低于此级别的内容实际上都是疏忽。” 这应该花不到 5 分钟的时间,如果你的老板不相信,那么他就没有在听。
但你可以继续说:“实施散列技术的成本可以忽略不计,而不实施它的成本可能达到数百万甚至更高。” “如果发生违规事件,经过适当哈希处理的数据库可以让您将自己定位为一个运行良好的安全意识组织,而不正确哈希处理的数据库是一个非常公开的尴尬,正如历史多次表明的那样,将媒体丝毫不能忽视或忽视。”
如果你想获得技术,你可以重新散列上面的内容。但如果你是在和你的老板交谈,那么你应该比那更清楚。类比的效果远不如仅仅展示在不需要糖衣的情况下完全可见的现实生活效果。
通过讲述一个很好的类比,你不会让人们戴上安全手套。取而代之的是,您将一些午餐肉放入烧杯中,当它在绿色和蓝色的火焰中爆炸时,您会说:“这就是您的手指会发生的事情。”
在这里使用相同的原理。
这个线程在类比方面有点短,所以这里是:
一个未散列的密码就像一把透明的锁,任何人只要看清楚它就可以设计匹配的钥匙。
首先,我将提供一个开始:
想象一下你管理一家银行。您不想让您的客户直接获得资金。所以你有一个出纳员,他只有一台电脑和少量的钱来处理日常的取款和存款。他无法访问所有内容,也无法将秘密传递给客户,因为他无权访问这些秘密。
出纳员很好,花花公子,但有时,你有一个人想抢劫银行,他不会真的被出纳员阻止。为了解决这个问题,你的地下室里有一个非常大的保险箱,里面装着你客户的所有真钱。这个保险箱有很多安全功能,比如指纹扫描仪、语音识别、压力开关、三键锁和定时锁。它旨在阻止所有不应该在那里以及不知道如何通过安检的人。
这个保险箱将阻止 99% 的强盗,但总有 1% 的人设法绕过所有的安全措施,要么绕过它,要么残酷地对待它。万一发生这种情况,银行会将他们的钱存放在带有诱杀装置的容器中,通过炸毁或在其上喷漆等手段,使这些钱无法使用。这样,强盗要么无法使用这笔钱,要么需要花费很长时间才能使这笔钱再次可用。
一个软件应用程序也有这些系统:用户使用的程序就是出纳员:他不能让它为所欲为,除非他找到一种甜言蜜语使其合作的方法。保护程序和数据库的硬件和软件配置是银行保险库:它将不知道所用安全配置的弱点的人拒之门外。以明文形式存储密码意味着如果有人通过程序和安全配置,他可以自由访问密码。就像银行将钱存放在一个容器中,这使得获取资金变得更加困难一样,对密码进行哈希处理会给泄露您密码的人带来他需要跨越的巨大障碍。这也意味着员工(包括银行、软件和我们自己公司的员工)不能受到压力,强迫或甜言蜜语绕过骗子的安全性,因为即使他们也不能直接访问金钱/密码。他们只能访问容器/哈希。
我喜欢用类比来解释技术,但是在这种情况下它可能不可行,因为类比太复杂了。
大多数经理更有动力避免对他们的职位造成个人风险,而不是做正确的事,因此我不会使用以纯文本形式存储密码对公司产生不良影响的例子进行类比。我只想说类似
“以纯文本形式存储密码会让我们看起来很糟糕,危及我们的声誉,并可能让自己面临诉讼。这在任何行业都被认为是非常糟糕的做法,并且有一些网站专门针对以明文形式存储密码的公司进行点名和羞辱. 就我个人而言,我不喜欢站在董事会/老板/首席技术官面前解释为什么我们没有实施基本的安全控制。如果我们对客户的密码进行哈希处理,数据泄露不会导致"