关于明文:为什么普通文字密码不好,我怎么说服我的老板他的珍贵网站有危险?

Why are plain text passwords bad, and how do I convince my boss that his treasured websites are in jeopardy?

我一直觉得将密码以纯文本的形式存储在数据库中是一件非常糟糕的事情(这里有人这么说)?.

历史上,我们的大多数服务器端编码需求都是外包给一组程序员的。他们在MySQL数据库中以纯文本形式存储密码。

作为常驻代码猴子(顺便说一句,第一个在服务器端工作的聪明猴子,所以我继承了地球,可以这么说),我有一种胃坑的感觉,当这种纯文本的胡说八道被利用的时候,它是我的屁股,将在网上。

我试着向我的老板解释纯文本密码有多糟糕,但我突然明白了:我不认为我真的知道它们为什么这么糟糕。除了给你的黑客一张银盘上的密码列表,还有别的吗?这对我来说已经够糟糕了,但在洛杉矶,我们的网站是"安全"的,对任何黑客都不敏感,这一论点似乎并没有切中要害。我怎样才能说服(或吓唬)我的老板,要求他在他珍贵的网站上进行散列讨论?

Related: Encrypting/Hashing plain
text passwords in
database


在军事上被称为"纵深防御"。理论上,你可以硬化每一层,而不是仅仅硬化一层,并希望它足够。

我听说过像你这样的数据库"外面硬,里面软,里面耐嚼"。专门的黑客有无数种方法可以访问您的数据库。社会工程,一个不满的雇员,一个决定看看他的登录是否仍然有效的前雇员,或者他写的后门仍然存在,一个错过的操作系统补丁…名单还在继续。

如果一个坏的参与者通过这些方法中的任何一种获得访问权,而不仅仅是获取数据,他就可以访问系统中每个用户的每个用户名/密码组合,正如有人指出的,人们通常对每个网站使用相同的组合。所以你的黑客出去,拥有数百人的贝宝,电子邮件和银行帐户。

我画了一幅够可怕的画了吗?


告诉他要考虑到,在许多公司,安全问题来自内部而非外部。

现在问问他,他将如何向他的客户解释下一次黑客出于某种原因解雇某人时,他们是如何窃取密码的(毫无疑问是在其他地方使用的密码)。

还要问他,他有多想让他的客户知道他们的密码对任何拥有数据库读取权限的人都是可见的。


以下是几个原因:

  • 有人可能闯入你的网站。这可能不太可能,而且这可能不会动摇你的老板(我现在可以听到谈话:"你是说网站不安全吗?")但这发生了,记住,没有人会认为他们的网站会真的被入侵到…
  • 内部人员(如您自己)随意查看数据库:您可能不会试图查看任何人的密码,但在正常工作过程中,您可能需要查看包含密码的表。考虑到很多人对所有事情都使用相同的密码(可能包括你的老板!)你不想暴露所有的密码。询问你的老板他是否曾在两个不同的网站上重复使用过密码
  • 如果有人发现您的应用程序没有加密密码,他们可能会严重质疑您的应用程序的信任度。
  • 在数据库中散列密码(最好是使用salt)基本上不需要花费任何费用,那么为什么不呢?

您可能希望指出,如果信息被泄露,未能妥善保护账户可能会使公司承担法律责任。如果用户的数据因公司的行为(或不作为,视情况而定)而暴露出来,忽略已知的漏洞最终可能会导致您损失法律费用。

在美国,有一些特定类型的数据,如金融和医疗信息,公司有法律义务保持安全和隐私。否则会造成严重后果。在这方面我不熟悉其他国家的法律,但如果贵公司正在处理这些数据,这是值得研究的。


除了安全风险之外,我想知道如果你的客户发现你公司的每个员工都有访问密码的权限,他们会怎么说。当涉及到可能的泄漏时,如果出现以下情况,密码将面临风险:

  • 数据库由外部公司备份
  • 运行DB软件的操作系统存在任何安全风险
  • 任何其他硬件或软件防火墙中的安全缺陷
  • 任何有权访问数据库的用户都会以某种方式获得一种可以利用数据的病毒。
  • 数据库恰好位于被盗的计算机或笔记本电脑上。
  • 一个不满的雇员被解雇,决定"回去"

每隔一段时间,你就会听到一些企业将敏感信息以纯文本的形式存储,而且永远不会有好的结果。我们都是人,容易出错,在安全问题上你不能假设完美。你将找不到任何大的、盈利的公司为任何可以避免的风险留出空间,因为任何可能发生的坏事都会发生…


如果"给你的饼干一张银盘上的密码列表"不是一个足够好的理由,那么什么是一个足够好的理由呢?


有太多的数据库的纯文本密码被窃取:如果发生在Reddit上,也可能发生在您身上。


如果您的组织维护PCI-DSS合规性(例如接受信用卡的商户),则不允许使用明文密码。见PCI DSS第8.4项。

如果您的组织是由联邦存款保险公司承保的金融机构,则不允许使用明文密码(请参见联邦存款保险公司FIL 69 2001)。

如果您希望获得ISO/IEC 27001认证(例如,如果您与某些政府机构合作),则应在传输和静止时对密码进行加密。


我看到的关于这个问题的两个好答案是:

  • 您可以保护密码不被窥探员工,即那些对数据库有合法访问权限的人,如果他们觉得有这种倾向,就不能轻易窃取密码,

  • 应用程序逻辑缺陷(如网站前端的SQL注入缺陷)将降低导致妥协的可能性。

  • 在我看来,加密数据库密码是一个好主意(尽管我还没有准备好为我的大多数应用程序加密),但更重要的是确保您的数据库服务器在网络和授权访问方面尽可能防弹。如果攻击者能够访问您的数据库,那么无论您如何存储密码,他们都能破解密码。