随着我继续构建越来越多的网站和 Web 应用程序,我经常被要求以一种方式存储用户的密码,如果 / 当用户遇到问题时可以检索它们(要么通过电子邮件发送忘记的密码链接,请通过当我能够对抗这种做法时,我会做很多 “额外” 编程,以便在不存储实际密码的情况下进行密码重置和管理协助。
当我无法抗争(或无法获胜)时,我总是以某种方式对密码进行编码,以至于它至少不会以明文形式存储在数据库中 - 尽管我知道如果我的数据库被黑客攻击破坏密码的罪魁祸首并不需要太多,所以这让我感到不舒服。
在一个完美的世界里,人们经常更新密码,而不是在许多不同的网站上复制密码 - 不幸的是,我知道许多人拥有相同的工作 / 家庭 / 电子邮件 / 银行密码,甚至在需要帮助时自由地给我。如果我的数据库安全程序由于某种原因失败,我不想成为他们的财务终结负责人。
在道德和道德上,我觉得有责任保护一些用户的生活,即使他们以较少的尊重对待他们。我确信有许多途径可以用来腌制哈希和不同的编码选项,但是当你必须存储它们时,是否有一个 “最佳实践”?在几乎所有情况下,我都使用 PHP 和 MySQL,如果这对我应该处理细节的方式有任何不同。
附加信息 Bounty
我想澄清一点,我知道这不是你想要做的事情,在大多数情况下拒绝这样做是最好的。但是,我并不是在寻找关于采取这种方法的优点的演讲我正在寻找采取这种方法时采取的最佳步骤。
在下面的一个注释中,我指出,当人们被要求执行安全的密码恢复程序时,主要针对老年人,智障人士或非常年轻人的网站可能会让人感到困惑。虽然在这些情况下我们可能会发现它简单而平凡,但有些用户需要额外的帮助,要么让服务技术人员帮助他们进入系统,要么将其直接通过电子邮件发送 / 显示给他们。
在这样的系统中,如果用户没有获得这种级别的访问协助,那么来自这些人口统计数据的流失率可能会阻碍应用程序,因此请记住这样的设置。
谢谢大家
这是一个有趣的问题,有很多争论,我很喜欢它。最后,我选择了一个保留密码安全性的答案(我不必保留纯文本或可恢复的密码),但也使我指定的用户群可以登录到系统而没有我从中找到的主要缺点正常的密码恢复。
由于不同的原因,我一直有大约 5 个答案,但我必须选择最好的答案 - 所有其他答案都是 + 1。感谢大家!
此外,感谢 Stack 社区中的每个人都投票赞成这个问题和 / 或将其标记为最喜欢的。我以 100 票赞成票作为赞美,并希望这次讨论能够帮助其他与我有同样关切的人。
如何针对这个问题采取另一种方法或角度?问为什么密码必须是明文的:如果用户可以检索密码,那么严格来说你不需要检索他们设置的密码(他们不记得它是什么),你需要能够为他们提供他们可以使用的密码。
想一想:如果用户需要检索密码,那是因为他们忘记了密码。在这种情况下,新密码与旧密码一样好。但是,今天使用的常见密码重置机制的缺点之一是在重置操作中生成的密码通常是一堆随机字符,因此用户很难简单地键入,除非他们复制 - n - 糊。对于不那么精明的计算机用户来说,这可能是个问题。
解决该问题的一种方法是提供或多或少自然语言文本的自动生成的密码。虽然自然语言字符串可能没有一串相同长度的随机字符所具有的熵,但没有任何内容表明您的自动生成的密码只需要 8 个(或 10 或 12 个)字符。通过将几个随机单词串在一起来获取高熵自动生成的密码短语(在它们之间留一个空格,因此任何可以阅读的人都可以识别并输入它们)。不同长度的六个随机单词可能比 10 个随机字符更容易正确且有信心地键入,并且它们也可以具有更高的熵。例如,从大写,小写,数字和 10 个标点符号(总共 72 个有效符号)中随机抽取的 10 个字符密码的熵将具有 61.7 比特的熵。使用 7776 个单词的字典(如 Diceware 使用的那样)可以随机选择六个字密码,密码短语的熵为 77.4 比特。有关详细信息,请参阅Diceware FAQ 。
一个约 77 位熵的密码:“承认散文耀斑表的敏锐天赋”
一个大约 74 位熵的密码:“K:&$ R ^ tt~qkD”
我知道我更喜欢输入短语,并且使用 copy-n-paste,这个短语也很容易使用密码,所以没有丢失。当然,如果您的网站(或任何受保护资产)对于自动生成的密码短语不需要 77 位熵,则生成较少的单词(我确信您的用户会欣赏)。
我理解存在密码保护资产的论点,这些资产确实没有很高的价值,因此破解密码可能不是世界末日。例如,我可能不会关心我在各种网站上使用的 80%的密码是否被破坏:所有可能发生的事情都是有人发送垃圾邮件或在我的名下发帖一段时间。那不会很好,但不像他们会侵入我的银行账户。但是,鉴于许多人使用与他们的银行账户(可能是国家安全数据库)相同的密码用于他们的网站论坛网站,我认为最好将这些 “低价值” 密码处理为非 - recoverable。
想象一下,有人委托建造了一座大型建筑 - 比如一个酒吧 - 并且会发生以下对话:
建筑师: 对于这样大小和容量的建筑,这里,这里和这里都需要消防通道。
客户: 不,这太复杂,维护成本太高,我不想要任何侧门或后门。
建筑师: 先生,消防通道不是可选的,根据城市的消防法规要求。
客户: 我不付钱给你辩论。做我问的事。
那么建筑师是否会在没有消防通道的情况下询问如何在道德上建造这座建筑?
在建筑和工程行业,谈话最有可能像这样结束:
建筑师: 这栋建筑不能在没有消防通道的情况下建造。你可以去任何其他有执照的专业人士,他会告诉你同样的事情。现在我要走了; 当你准备合作时,给我回电话。
计算机编程可能不是一个许可的专业,但人们似乎常常想知道为什么我们的专业不会得到与民用或机械工程师相同的尊重 - 好吧,不要再看了。那些职业,当交给垃圾(或完全危险)的要求时,将简单地拒绝。他们知道这不是一个借口说,“好吧,我尽了最大努力,但他坚持说,我必须按照他说的去做。” 他们可能因为这个借口而失去执照。
我不知道您或您的客户是否属于任何上市公司,但以任何可恢复的形式存储密码将导致您失败几种不同类型的安全审核。问题不在于有些 “黑客” 访问您的数据库以恢复密码的难度。 绝大多数安全威胁都是内部威胁。您需要防范的是一些心怀不满的员工走出所有密码并将其出售给出价最高者。使用非对称加密并将私钥存储在单独的数据库中绝对没有什么可以阻止这种情况; 总会有人访问私人数据库,这是一个严重的安全风险。
以可恢复的形式存储密码没有道德或负责任的方式。期。
您可以使用公钥加密密码 + 盐。对于登录,只需检查存储的值是否等于从用户输入 + salt 计算的值。如果有时间,当需要以明文恢复密码时,您可以使用私钥手动或半自动解密。私钥可以存储在别处,并且可以另外对称地加密(这将需要人工交互来解密密码)。
我认为这实际上与Windows 恢复代理的工作方式类似。