随着我继续构建越来越多的网站和 Web应用程序,我经常被要求以一种在用户遇到问题时可以检索到的方式存储用户的密码(或者通过电子邮件发送忘记的密码链接,通过电话等)我什么时候可以激烈地反对这种做法,我做了很多“额外的”编程,以使密码重置和管理协助成为可能,而无需存储他们的实际密码。
当我可以“对抗”(或可以“赢”)时,我总是以某种方式对密码进行编码,以便它至少“以明文形式存储在数据库中”——尽管我知道如果我的数据库得到hacked 罪魁祸首破解密码不需要太多,所以这让我很不舒服。
在一个完美的世界里,人们会经常更新密码,而不是在许多不同的网站上重复密码——幸运的是,我知道很多人拥有相同的工作/家庭/电子邮件/银行密码,甚至在他们需要帮助时免费提供给我。如果我的数据库安全程序由于某种原因失败,我不想成为对他们的财务死亡负责的人。
在道德和伦理上,我觉得有责任保护一些用户的生计,即使他们对待它的尊重要少得多。我确信有很多方法可以解决哈希哈希和不同的编码选项,但是当你必须存储它们时,是否有一个单一的“最佳实践”?在几乎所有情况下,如果这对我处理细节的方式有任何影响,我都会使用 PHP 和 MySQL。
赏金的附加信息
我想澄清一下,我知道这不是您必须要做的事情,而且在大多数情况下拒绝这样做是最好的。然而,我并不是在寻找关于采用这种方法的优点的讲座,我正在寻找如果你采用这种方法的最佳步骤。
在下面的注释中,我指出,当人们被要求执行安全的密码恢复程序时,主要面向老年人、智障或非常年轻的网站可能会让他们感到困惑。尽管在这些情况下我们可能会发现它简单而平凡,但某些用户需要额外的帮助,即让服务技术帮助他们进入系统或将其通过电子邮件发送/直接显示给他们。
在这样的系统中,如果用户没有获得这种级别的访问帮助,这些人口统计数据的流失率可能会阻碍应用程序,因此请记住这样的设置来回答。
谢谢大家
这是一个有趣的问题,有很多争论,我很喜欢。最后,我选择了一个既保留密码安全性(我不必保留纯文本或可恢复密码)的答案,又使我指定的用户群可以登录系统而没有我发现的主要缺点正常密码恢复。
与往常一样,由于不同的原因,我希望将大约 5 个答案标记为正确,但我必须选择最好的一个——其余的都得到了 +1。感谢大家!
另外,感谢 Stack 社区中为这个问题投票和/或将其标记为收藏的每个人。我将获得 100 票赞成作为一种恭维,并希望这次讨论能帮助与我有同样担忧的其他人。
在这个问题上采取另一种方法或角度怎么样?问为什么要求密码是明文的:如果是为了让用户可以找回密码,那么严格来说你并不需要找回他们设置的密码(反正他们不记得是什么了),你需要能够给他们一个他们 可以使用 的密码。
想一想:如果用户需要找回密码,那是因为他们忘记了密码。在这种情况下,新密码与旧密码一样好。但是,当今使用的常见密码重置机制的一个缺点是,在重置操作中生成的密码通常是一堆随机字符,因此用户很难简单地正确输入,除非他们复制- n-粘贴。对于不太精明的计算机用户来说,这可能是一个问题。
解决该问题的一种方法是提供自动生成的密码,这些密码或多或少是自然语言文本。虽然自然语言字符串可能不具有相同长度的随机字符串所具有的熵,但没有任何内容表明您的自动生成的密码只需要 8(或 10 或 12)个字符。通过将几个随机单词串在一起来获得一个高熵自动生成的密码(在它们之间留一个空格,这样任何可以阅读的人仍然可以识别和输入它们)。六个不同长度的随机单词可能比 10 个随机字符更容易正确和自信地键入,并且它们也可以具有更高的熵。例如,从大写、小写、随机抽取的 10 个字符密码的熵 数字和 10 个标点符号(总共 72 个有效符号)的熵为 61.7 位。使用一个包含 7776 个单词的字典(如 Diceware 使用的那样),可以随机选择一个六字密码短语,密码短语的熵为 77.4 位。见Diceware 常见问题解答了解更多信息。
一个大约 77 位熵的密码:“承认散文耀斑表急性天赋”
具有大约 74 位熵的密码:“K:&$R^tt~qkD”
我知道我更喜欢输入该短语,并且使用复制粘贴,该短语也与密码一样易于使用,因此不会丢失。当然,如果您的网站(或任何受保护的资产)不需要 77 位熵来自动生成密码,请生成更少的单词(我相信您的用户会喜欢的)。
我理解存在密码保护资产实际上没有高价值的论点,因此密码泄露可能不是世界末日。例如,我可能不在乎我在各种网站上使用的 80% 的密码是否被泄露:所有可能发生的情况都是有人在一段时间内发送垃圾邮件或以我的名义发帖。那不会很好,但他们不会闯入我的银行账户。然而,鉴于许多人在他们的论坛网站上使用与他们的银行账户(可能还有国家安全数据库)相同的密码,我认为最好将那些“低价值”密码作为非- 可恢复的。