在以后的纯文本检索中,我应该如何道德地使用用户密码存储?


1344

随着我继续建立越来越多的网站和Web应用程序,经常会要求我以某种方式存储用户密码,以便在用户遇到问题时(如果要通过电子邮件发送被忘记的密码链接,请通过电话等)时,我会竭尽全力反对这种做法,并且我进行了很多“额外”编程,以使密码重置和管理协助成为可能,而无需存储其实际密码。

当我无法与之抗衡(或无法获胜)时,我总是以某种方式对密码进行编码,以使它至少不会以明文形式存储在数据库中,尽管我知道如果我的数据库被黑了罪魁祸首破解密码并不需要太多,这让我很不舒服。

在一个理想的世界中,人们会经常更新密码,并且不会在许多不同的站点上重复使用密码-不幸的是,我知道许多人拥有相同的工作/家庭/电子邮件/银行密码,甚至在需要帮助时也免费将其提供给我。如果我的数据库安全性程序由于某种原因失败,我不想成为负责他们财务崩溃的人。

在道德上和道德上,我认为有责任保护某些用户的生计,即使他们以较少的尊重来对待它。我敢肯定,盐腌哈希和不同的编码选项有很多方法和参数,但是当您存储它们时是否有一个“最佳实践”?在几乎所有情况下,如果对我处理细节的方式有任何不同,我都会使用PHP和MySQL。

赏金的其他信息

我想澄清一下,我知道这不是您要做的事情,并且在大多数情况下,拒绝这样做是最好的。但是,我不是要就采用这种方法的优点进行演讲,而是要寻求采取这种方法的最佳步骤。

在下面的注释中,我指出,当网站要求人们执行安全的密码恢复例程时,这些网站主要面向老年人,智障人士或非常年轻的人。尽管在某些情况下我们可能会发现它简单而平凡,但有些用户需要额外的帮助,要么让服务技术帮助他们进入系统,要么直接将其通过电子邮件发送/显示给他们。

在此类系统中,如果没有为用户提供这种级别的访问帮助,则这些人口统计信息的损耗率可能会使应用程序受挫,因此请牢记这一设置。

谢谢大家

这是一个有趣的问题,有很多辩论,我很喜欢。最后,我选择了一个既可以保持密码安全性(我将不必保留纯文本或可恢复的密码),又可以使我指定的用户群登录系统而没有发现我的主要缺点的答案正常的密码恢复。

与往常一样,出于各种原因,我希望将大约5个答案标记为正确答案,但我必须选择最佳答案-其余所有答案都为+1。谢谢大家!

另外,还要感谢Stack社区中的每个人对此问题进行投票和/或将其标记为收藏。我赞扬100票,并希望这次讨论对我所关心的其他问题有所帮助。


155
我认为他知道这不好。他仍在根据规定的要求寻找最佳解决方案。
stefanw 2010年

33
最终,您要做的就是仔细实现可避免的漏洞。
rook 2010年

20
@Michael Brooks-我想让您知道我完全同意CWE-257,并且希望每当我被要求将密码恢复为纯文本格式时,都应逐字引用。但是,实际上,客户和用户很少对NIST法规感兴趣,只是希望我仍然这样做。90%的时间我可以用其他方式说服他们,但是在那10%的时间里,我无法确定最佳的执行方法-在那种情况下,CWE-257灰烬在我的手中(不幸的是)。
Shane 2010年

81
@AviD:系统的“低价值”与这个问题完全无关,因为人们会重用他们的密码。人们为什么不能理解这个简单的事实?如果您在某些“低价值”系统上破解密码,则可能会为其他“高价值”系统使用多个有效密码。
亚罗诺

20
我刚才在评论流中对我的回答也提到了另一点:您如何知道要求这些要求的人是值得信任的?如果“可用性”借口只是一个门面,掩盖了将来某个时候窃取密码的真实意图,该怎么办?您的天真人可能使客户和股东损失了数百万美元。安全专家必须重复多少次才能最终发现:最常见和最严重的安全威胁始终是内部威胁。
亚罗诺

Answers:


1037

在这个问题上采取其他方法或角度如何?询问为什么要求密码必须为纯文本格式:如果是这样,以便用户可以检索密码,那么严格来说,您实际上并不需要检索他们设置的密码(无论如何,它们都不记得了),您需要能够给他们提供可以使用的密码。

考虑一下:如果用户需要检索密码,那是因为他们忘记了密码。在这种情况下,新密码与旧密码一样好。但是,当今使用的通用密码重置机制的缺点之一是,在重置操作中生成的生成的密码通常是一堆随机字符,因此用户很难简单地正确输入,除非他们复制了n-糊。对于不那么精明的计算机用户来说,这可能是个问题。

解决该问题的一种方法是提供自动生成的或多或少自然语言文字的密码。虽然自然语言字符串可能不具有相同长度的随机字符字符串所具有的熵,但是没有什么可以说自动生成的密码只需要8个(或10或12个)字符即可。通过将几个随机词串在一起来获得一个高熵自动生成的密码短语(在它们之间留一个空格,以便任何可读的人都可以识别和键入它们)。与10个随机字符相比,六个不同长度的随机词可能更容易正确正确地置信,并且它们的熵也较高。例如,从大写字母,小写字母,数字和10个标点符号(总共72个有效符号)的熵为61.7位。使用可以为6个单词的密码短语随机选择的7776个单词的词典(如Diceware所用),密码短语的熵为77.4位。看到有关更多信息的Diceware常见问题解答

  • 带有约77位熵的密码短语:“允许散文耀斑表显示出敏锐的才华”

  • 具有约74位熵的密码:“ K:&$ R ^ tt〜qkD”

我知道我更喜欢键入该短语,并且使用copy-n-paste时,该短语也比密码更容易使用,因此不会丢失密码。当然,如果您的网站(或任何受保护的资产)不需要77比特的熵来自动生成密码,请生成较少的单词(我相信您的用户会喜欢的)。

我理解这样的论点,即确实有一些没有密码保护的资产没有很高的价值,因此违反密码可能不是世界末日。例如,我可能不在乎我在各种网站上使用的80%的密码是否被泄露:所有可能发生的事情是某人以我的名义发送了一段时间的垃圾邮件或发帖。那不是很好,但这并不是说他们会闯入我的银行帐户。但是,鉴于许多人在其网站论坛站点上使用的密码与他们在银行帐户(可能是国家安全数据库)上使用的密码相同,因此我认为最好将那些“低价值”密码作为非密码处理。 -可恢复。


93
+1密码短语,目前似乎可以在密码强度和用户回忆之间提供最佳的平衡。
Aaronaught

197
您也可以造出完整的句子,例如<形容词> <名词>是<动词> <副词>。绿猫在狂跳。有类别列表。每个选项有1024个选择,您就有40位的熵。
多米尼克·韦伯

28
+1考虑将密码重用视为避免密码重用的关键问题
lurscher 2010年

57
“考虑一下-如果用户需要检索密码,那是因为他们忘记了密码”-不一定正确!我经常想获取密码,因为我在笔记本电脑上,并且我知道我的机器在家里存储了我的密码,或者将密码写在安全的地方,我不想通过发行新的密码来破解密码。
joachim 2010年

5
新IT Security SE站点上得分最高的问题涉及此熵计算的有效性。(当然,从技术上讲,它与XKCD交易,@Pieter联系。)
持久性有机污染物

592

假设有人委托建造一座大型建筑物-假设是一间酒吧-发生了以下对话:

建筑师: 对于这种大小和容量的建筑物,您将需要在此处,此处和此处设置消防通道。
客户: 不,维护起来太复杂和昂贵,我不需要任何侧门或后门。
建筑师: 主席先生,消防通道不是可选的,根据城市的消防法规要求是必须的。
客户: 我不付钱给你争论。随我便

建筑师是否会问如何在没有火灾出口的情况下道德建造这座建筑?

在建筑和工程行业中,对话最有可能像这样结束:

建筑师: 如果没有消防通道,则无法建造该建筑物。您可以去找其他持牌专业人士,他会告诉您同样的事情。现在我要走了; 准备合作时给我回电。

计算机编程可能不是一个许可的职业,但是人们似乎常常想知道为什么我们的职业没有像土木或机械工程师那样受到尊敬-好吧,别无所求。这些专业在遇到垃圾(或完全危险)要求时,只会拒绝。他们知道说“嗯,我尽力而为,但他坚持要我去做他说的话”不是借口。他们可能会为此借口失去执照。

我不知道您或您的客户是否是任何公开上市公司的一部分,但是以任何可恢复的形式存储密码会使您无法通过几种不同类型的安全审核。问题并不在于某些“黑客”能够访问您的数据库以恢复密码有多么困难。 绝大多数安全威胁是内部的。 您需要防止的是一些心怀不满的员工带走所有密码,然后将其出售给出价最高的人。使用非对称加密并将私钥存储在单独的数据库中绝对不会阻止这种情况。总是会有人可以访问私有数据库,这是一个严重的安全隐患。

没有道德或负责任的方式以可恢复的形式存储密码。期。


124
@Aaronaught-我认为这是一个公平而有效的观点,但让我在您身上扭转一下。您正在以雇员的身份为一家公司从事项目,而老板说“这是我们系统的要求”(无论出于何种原因)。您是否因义愤填off了这份工作?我知道在完全控制的情况下我有义务承担责任-但是,如果公司选择冒审计或责任失败的风险,那么我有责任牺牲自己的工作来证明观点,还是我追求最佳?和SAFEST的方式去做他们所说的话?只是扮演恶魔的拥护者..
Shane

44
我不是律师,但是请考虑一下。如果您的主管命令您采取违背公司利益的行动,例如使他们承担容易避免的责任,那么您的工作是服从还是礼貌地拒绝?是的,他们是您的老板,但即使是投资者,他们也有自己的老板。如果您不理会他们的头,那么利用您的安全漏洞时,谁的头将滚动?只是要考虑的事情。
史蒂文·苏迪特

68
开发人员总是试图说出我们的工作比其他人难得多,因为我们得到的垃圾要求一直在变化。好吧,这是一个很好的例子。我们的行业急需骨干。我们的行业迫切需要说:“不,这不是一个可以接受的要求,这不是我可以真诚发展的,您可能是我的客户/雇主,但我对您的客户和公众负有专业责任,如果您想做到这一点,那么您将不得不去别处。”
Aaronaught

36
@sfussenegger:您不需要了解背景。这是不可接受的。您假设客户是100%可信赖的-如果他特别要求此要求,以便以后可以取消密码,该怎么办?安全是发展中的几个项目之一刻在石头上。有些事情您只是不做,存储可恢复的密码就是其中的十个。
Aaronaught

37
好吧,现在就开始进行风险评估。“如果以可恢复的形式存储密码,则会造成密码被盗的风险,这很重要。至少某些用户也可能将相同的密码用于其电子邮件和银行帐户。如果密码被盗,并且银行帐户已被耗尽,这可能会成为头条新闻,再也没人会与您开展业务,并且您可能会被起诉而已。我们现在可以废话吗?您在其中引入“纳粹”一词的事实清楚地表明您毫无道理。
Aaronaught

206

您可以使用公共密钥加密密码+盐。对于登录,只需检查存储的值是否等于从用户输入+ salt计算得出的值。如果需要以明文形式恢复密码,则可以使用私钥手动或半自动解密。私钥可以存储在其他地方,也可以对称地进行加密(然后需要人工干预才能解密密码)。

我认为这实际上与 Windows Recovery Agent的工作方式。

  • 密码以加密方式存储
  • 人们可以登录而无需解密为纯文本
  • 密码可以恢复为纯文本,但只能使用私钥,该私钥可以存储在系统外部(如果需要,可以存储在银行保险箱中)。

34
-1密码不应该被“加密”这是违反CWE-257的cwe.mitre.org/data/definitions/257.html

100
1.问题表明密码应该可以恢复为纯文本,因此这是一项要求。2.我在这里使用非对称加密,而不是对称加密。解密密钥对于日常操作不是必需的,可以保存在银行保险箱中。链接中的论点是有效的,但不适用于这种情况。
stefanw 2010年

57
是的,但是您是否可以同意,鉴于要求,这是最负责任的方式?您可以使用CWE-257整天打我,这不会改变有趣的问题,即安全地存储和使用凭证,并在需要时能够将其恢复为原始格式。
stefanw

10
Windows Recovery Agent在这里也不是很好的例子,因为它处理实际的加密,而不是密码管理。加密密钥是一样的密码; 每个规则和实践完全不同。加密和身份验证不同。加密是为了保护隐私 -密钥用于保护数据。身份验证用于身份,其中密钥是数据(它是身份验证过程中的一个因素)。因此,我重复一遍,加密和身份验证并不相同。您不能将一个原则有效地应用于另一个原则。
亚罗诺

16
+1执着地坚持CWE-257的意义何在?这是一个弱点(CWE),而不是一个漏洞(CVE)。将可恢复的密码与缓冲区溢出进行比较,就是比较苹果和橘子。只需确保客户理解问题(让他签字,表明自己的意思,否则他可能会不记得任何事情)然后继续。此外,所需的安全措施取决于系统的价值和潜在的攻击风险。如果成功的攻击者只能取消一些新闻订阅,则没有理由争论任何问题。
sfussenegger 2010年

133

不要放弃 您可以用来说服客户的武器是不可抵赖性。如果您可以通过任何机制来重建用户密码,则您已经为其客户提供了合法的不可否认机制,他们可以拒绝依赖该密码的任何交易,因为供应商无法证明他们没有重构密码。并自行完成交易。如果将密码正确地存储为摘要而不是密文,则这是不可能的,这将导致最终客户自己执行交易或违反了密码的谨慎义务。无论哪种情况,责任都由他承担。我曾处理过数亿美元的案件。并非您想出错的地方。


2
网络服务器日志不计入法院?还是在这种情况下,它们也会被认为是伪造的?
Vinko Vrsalovic'3

10
@Vinko Vrsalovic,Web服务器日志应在法庭上计数,为此,您需要证明不可否认性,真实性证明,证据链等,而这些Web服务器日志显然不是。
AviD

7
究竟。供应商必须证明只有客户才能执行该交易。Web服务器日志不执行此操作。
user207421'3

可以这么说,并不是“交易”实际上确实需要所有密码。说该网站是用于开发网页书签列表的。在这种情况下,责任限额(通常在注册网站时在交易条款和条件中规定)为零,因为没有金融交易。如果该网站没有影响他人的行为,那么数据最多会丢失给被黑用户。该公司受T&C的保护。
Sablefoste

1
@Sablefoste在该网站上。如果用户在其他地方使用相同的密码,则可能会泄露其私人凭据。如果您从不练习,就不会引起问题。
user207421

94

您不能合乎道德地存储密码以供以后的纯文本检索。就这么简单。甚至Jon Skeet也无法合乎道德地存储密码以供以后的纯文本检索。如果您的用户可以以某种方式或其他方式检索纯文本密码,那么在您的代码中发现安全漏洞的黑客也可能这样做。这不只是一个用户密码被泄露,而是所有密码都被泄露了。

如果您的客户对此有疑问,请告诉他们可恢复存储密码是违法的。在英国,无论如何,《 1998年数据保护法》(尤其是附表1,第二部分,第9段)要求数据控制者使用适当的技术措施来保护个人数据的安全,其中包括:如果数据遭到破坏可能会造成伤害-对于在站点之间共享密码的用户来说可能是相当大的损失。如果他们仍然无法理解这是一个问题,请向他们指出一些实际的示例,例如示例。

允许用户恢复登录名的最简单方法是通过电子邮件向他们发送一次性链接,该链接会自动将其登录并直接带他们到可以选择新密码的页面。创建一个原型并将其展示给他们看。

这是我写过的一些博客文章:

更新:我们现在开始看到针对未能正确保护其用户密码的公司的诉讼和起诉。示例:LinkedIn遭受了500万美元的集体诉讼索尼因PlayStation数据黑客而被罚款25万英镑。如果我没记错的话,LinkedIn实际上是在加密用户密码,但是它使用的加密太弱而无法生效。


8
@jimmycakes-在低安全性的系统上这样做是一件好事,但是,如果您要存储任何高价值的数据,则必须假定这些人员的电子邮件已经受到破坏,并且向他们发送直接登录链接会危害您的系统。+1可以替代我的问题,但指出了整个逻辑上的缺陷。我不希望Payppal曾经发送直接登录链接。听起来可能有些偏执,但我始终认为我的电子邮件帐户已损坏-这使我很诚实。;)
Shane 2010年

绝对-我希望我的银行至少可以给我打个电话并验证我的身份,然后再让我重设(无法恢复)密码。我在这里概述的是我希望从任何网站,任何地方访问密码的绝对最低标准。
jammycakes

1
忽略没有您设置的限制的银行或贝宝;如果您认为他们的电子邮件已被盗用,怎么可能使用任何在线方法?如果您通过电子邮件发送生成的密码,该密码是否更安全?
彼得·库尔顿

我不是在谈论获取一个人的密码,而是在从数据库获取多个密码。如果系统将密码可恢复地存储为纯文本,则黑客可能会编写脚本以从数据库中提取所有密码。
jammycakes

我想知道如何通过电子邮件发送链接/密码,以未知的网络节点以纯格式通过网络...
Jakub

55

阅读此部分后:

在下面的注释中,我指出,当网站要求人们执行安全的密码恢复例程时,这些网站主要面向老年人,智障人士或非常年轻的人。尽管在某些情况下我们可能会发现它简单而平凡,但有些用户需要额外的帮助,要么让服务技术帮助他们进入系统,要么直接将其通过电子邮件发送/显示给他们。

在此类系统中,如果没有为用户提供这种级别的访问帮助,则这些人口统计信息的损耗率可能会使应用程序受挫,因此请牢记这一设置。

我不知道这些要求中的任何一项是否要求使用可检索的密码系统。例如:Mabel姨妈打电话说:“您的互联网程序不起作用,我不知道密码”。客户服务无人机说“确定”,“让我检查一些详细信息,然后为您提供一个新密码。当您下次登录时,它将询问您是否要保留该密码或将其更改为您可以记住的密码更容易。”

然后,设置系统以知道何时发生密码重置并显示“您想保留新密码还是选择新密码”消息。

对于那些不懂PC的人来说,这比告诉他们原来的密码有何糟糕?而且,尽管客户服务人员可以调皮捣蛋,但数据库本身在受到破坏时更加安全。

评论对我的建议不利的事情,然后我将建议一个实际上可以实现您最初想要的解决方案。


4
@john-我认为这是一个完全可行的解决方案。不过,要准备好应对内部威胁!您知道,如果我要进行一次中间密码重置(技术人员将密码手动设置为临时密码,并告诉Mabel输入1234作为她的密码),那么它在不包含重要数据的系统上可能会很好地工作。如果这是一个高度安全的环境,那么我们将遇到一个问题,即托管服务可以将CEO的密码设置为1234并直接登录。没有完美的解决方案,但是这种解决方案在很多情况下都可以使用。(+1)
Shane 2010年

5
我刚刚注意到这个答案。@Shane,我不明白为什么您预测“内部威胁”会激增。更改密码的能力并不是一个明显的弱点。问题在于能否发现可能用于其他服务的密码-她的电子邮件,她的银行,她的存储CC信息的在线购物网站。这种弱点在这里没有表现出来。如果Bob重置了Mabel的密码并通过电话告诉了她,那将无法使他访问她的任何其他帐户。但是,我会强制而不是“建议”登录时重设密码。
Aaronaught

@Aaronaught-我明白您的意思,但是我想到的是即使是客户服务人员也被锁定在系统的某些区域(例如薪资,会计等)之外并允许他们直接设置密码的时代是本身就是安全问题。我确实看到了您的观点,但是我问这个问题的系统类型与内部会计系统有很大不同。关于专有内部系统和其中的密码安全性,我们可能会有完全不同的讨论。
Shane 2010年

1
@Shane:然后这个问题变得更没有意义了。我以为您希望有人通过电话读取密码。如果您想通过某个自动自助服务系统向用户发送密码,那么您也可以完全省去该密码,因为它受到了弱得多的“保护”。也许您需要更加确切地说明您要支持哪种可用性方案。也许该分析随后会向您显示甚至不需要可恢复的密码。
Aaronaught

4
支持人员提供的代码实际上不必是新密码。它可以是一次性密码解锁密码重置功能。
kgilpin 2013年

42

迈克尔·布鲁克斯(Michael Brooks)一直对CWE-257持保留态度-无论您使用哪种方法,您(管理员)仍然可以恢复密码。那么这些选项如何:

  1. 使用其他人的公共密钥(某些外部权限)对密码进行加密。这样一来,您就无法亲自重建它,用户将不得不去找外部权威机构并要求恢复其密码。
  2. 使用从第二个密码生成的密钥对密码进行加密。在客户端进行此加密,切勿将其明文传输到服务器。然后,要恢复,请通过从客户端输入重新生成密钥来再次执行解密客户端。诚然,这种方法基本上是使用第二个密码,但是您总是可以告诉他们写下该密码,或者使用旧的安全性问题方法。

我认为1.是更好的选择,因为它使您可以指定客户公司中的某人持有私钥。确保他们自己生成密钥,并将其与指令一起存储在安全的容器中。您甚至可以通过选择只加密并将某些字符(从密码中提供给内部第三方)来增加安全性,这样他们就必须破解密码才能猜测它。将这些字符提供给用户,他们可能会记住它是什么!


8
而且,当然,您可以使用任何秘密分割技术来要求公司中的多个人进行解密。但没有一种可满足了能够发送电子邮件的用户他们的密码还是有一定的流失的磨一级手机支持者走他们通过记录在原来的要求。
克里斯托弗Creutzig

27

为了回答这个问题,已经有很多关于用户安全性问题的讨论,但是我想提到一些好处。到目前为止,我还没有看到关于在系统上存储可恢复密码的任何合法好处。考虑一下:

  • 用户将密码发送给他们是否会受益?不会。他们将从一次性使用的密码重置链接中获得更多好处,该链接有望使他们选择自己记住的密码。
  • 用户在屏幕上显示密码是否会受益?否,出于与上述相同的原因;他们应该选择一个新密码。
  • 用户可以从支持人员向用户说出密码中受益吗?没有; 同样,如果支持人员认为用户对他们的密码请求进行了正确的身份验证,那么给用户一个新的密码和更改密码的机会就更大了。另外,电话支持比自动重置密码的成本更高,因此该公司也没有从中受益。

似乎唯一可以从可恢复的密码中受益的是那些具有恶意意图或不良API支持者,需要第三方密码交换的人(请永远不要使用上述API!)。也许您可以如实地向客户说明公司通过存储可恢复的密码不会获得任何利益,而只会承担任何责任,从而赢得了您的支持。

仔细阅读这些类型的请求,您会发现您的客户可能不了解甚至根本不在乎密码的管理方式。他们真正想要的是一种对用户来说并不难的身份验证系统。因此,除了告诉他们实际上他们实际上不希望密码是否可恢复外,您还应该为他们提供减轻身份验证过程麻烦的方法,尤其是在不需要银行等高安全级别的情况下:

  • 允许用户使用其电子邮件地址作为其用户名。我见过无数种情况,用户忘记了用户名,但很少有人忘记他们的电子邮件地址。
  • 提供OpenID,让第三方为用户健忘付出代价。
  • 放宽密码限制。我敢肯定,当某些网站由于诸如“您不能使用特殊字符”或“您的密码太长”或“您的密码必须开始”之类的无用要求而不允许您使用首选密码时,我们都会感到非常恼火和一封信。” 同样,如果易用性比密码强度更受关注,则可以通过允许使用较短的密码或不需要混合字符类来放宽甚至是非愚蠢的要求。有了宽松的限制,用户将更有可能使用他们不会忘记的密码。
  • 不要使密码过期。
  • 允许用户重用旧密码。
  • 允许用户选择自己的密码重置问题。

但是,如果您出于某种原因(并请告诉我们原因)真的,真的,真的需要能够恢复密码,则可以通过为用户提供非密码来保护其免受其他在线帐户的危害,基于身份验证系统。因为人们已经很熟悉用户名/密码系统,并且它们是一种执行良好的解决方案,所以这将是最后的选择,但是肯定有很多创造性的密码替代方法:

  • 让用户选择一个数字引脚,最好不要选择4位数,并且最好仅在防止蛮力尝试的情况下选择。
  • 让用户选择一个简短答案的问题,只有他们知道答案,永远不会改变,他们会永远记住,他们不会介意其他人发现答案。
  • 让用户输入用户名,然后绘制一个易于记忆的形状,并进行足够的排列以防止猜测(请参见这张精美的照片,其中介绍了G1如何解锁手机)。
  • 对于儿童网站,您可以根据用户名(类似于identicon)自动生成模糊的生物,并要求用户给该生物提供一个秘密名称。然后可以提示他们输入生物的秘密名称以登录。

我在这里回应了我的评论,因为这很冗长-我认为重要的是回顾分析和对提出的问题的讨论。stackoverflow.com/questions/2283937/...
狂热的

用户在屏幕上显示密码是否会受益?我认为-肯定是的!每当我从提供的互联网上获得晦涩的密码时,我都要感谢苹果公司,因为我可以使它可见,因此我不必在痛苦的情况下再输入100次。我能想象残疾人会怎样。
Dmitri Zaitsev

1
为什么显示一个晦涩的密码比让您选择一个可以记住的新密码更好?
2013年

@雅各布:更多的熵?
Alexander Shcheblikin 2014年

25

根据我对这个问题的评论:
几乎每个人都掩盖了一个要点...我的最初反应与@Michael Brooks非常相似,直到我意识到像@stefanw一样,这里的问题已被打破。 ,但这就是它们的本质。
但是后来我想到,事实可能并非如此!这里缺少的一点是应用程序资产的潜伏价值。简而言之,对于低价值的系统,完全安全的身份验证机制(涉及所有过程)将是过大的选择,并且安全选择错误
显然,对于银行而言,“最佳实践”是必须的,并且没有道德上违反CWE-257的方法。但是很容易想到不值得的低价值系统(但是仍然需要一个简单的密码)。

要记住,重要的是,真正的安全专业知识是在寻找适当的权衡方法,而不是教条地吐出任何人都可以在线阅读的“最佳实践”。

因此,我建议另一种解决方案:
取决于系统的价值,并且当系统具有适当的低价值且没有“昂贵的”资产(包括身份本身),并且存在进行适当流程的有效业务需求时,不可能(或足够困难/昂贵),并且让客户端意识到所有注意事项...
然后,可能允许简单地允许可逆加密,而无需跳过任何特殊的陷阱。
我只想说一点也不打扰加密,因为它实现起来非常简单/便宜(即使考虑可通过的密钥管理),并且它确实提供了一些保护(比实现它的成本还高)。此外,值得一看的是如何为用户提供原始密码(无论是通过电子邮件,在屏幕上显示等)。
由于此处的假设是被盗密码的值(即使是总计)也很低,因此任何这些解决方案可能是有效的。


由于正在进行激烈的讨论,实际上在不同的帖子和单独的评论线程中进行了几次活跃的讨论,因此我将添加一些说明,并对此处其他地方提出的一些很好的观点做出回应。

首先,我认为这里的每个人都很清楚,允许检索用户的原始密码是不正确的做法,通常不是一个好主意。这一点根本不存在争议。
此外,我要强调的是,在大多数情况下,即使是在大多数情况下,这都是错误的,甚至是犯规,令人讨厌和丑陋的

但是,问题的症结在于原则,是否有任何情况是没有必要禁止这种情况发生的,如果是的话,如何以最适合这种情况的正确方式做到这一点

现在,就像@ Thomas,@ sfussenegger和其他一些人提到的那样,回答该问题的唯一正确方法是对任何给定(或假设)情况进行彻底的风险分析,以了解存在的风险,有多少保护价值,还有哪些其他缓解措施可以提供这种保护。
不,这不是流行语,它是实时安全专家的基本,最重要的工具之一。最佳做法在某种程度上是好的(通常是针对经验不足和黑客的准则),在此之后,经过深思熟虑的风险分析将占据上风。

是的,这很有趣-我一直认为自己是安全狂热者之一,但我却处于那些所谓的“安全专家”的对立面……嗯,事实是-因为我是狂热者,以及一位真正的现实生活安全专家-我不相信没有最重要的风险分析就吐出“最佳实践”教条(或CWE)。
“要当心安全狂热者,他们会迅速应用工具带中的所有内容,却不知道他们要防御的实际问题是什么。更多的安全性不一定等同于良好的安全性。”
风险分析和真正的安全狂热者将根据风险,潜在损失,可能的威胁,补充缓解措施等,基于价值/风险进行更明智的权衡。任何“安全专家”都不能将合理的风险分析视为他们提出建议的依据,或支持逻辑上的权衡,但他们宁愿吐出教条和CWE,甚至不了解如何执行风险分析,都无济于事,但Security Hacks和他们的专业知识不值得他们印在上面。

的确,这就是我们使机场安全变得荒谬的原因。

但是,在我们讨论要在此情况下进行适当的权衡之前,让我们先看一下明显的风险(显然,因为我们没有关于这种情况的所有背景信息,所以我们都在假设-因为问题是假设的,情况可能会...)
让我们假设一个低价值的系统,但还不是很普通,以至于它是公共访问的-系统所有者想要防止随意的冒充,但是“高”的安全性并不像易用性那么重要。(是的,要接受任何熟练的脚本小子可以入侵该网站的风险是一种合理的折衷……等等,APT现在不流行吗??)
举例来说,假设我正在为一个大型家庭聚会安排一个简单的地点,让每个人都可以集思广益,确定我们今年想要进行露营的地方。我不太担心一些匿名黑客,甚至不用担心表亲弗雷德(Cousin Fred)反复提出建议回到旺塔玛纳比基里基湖(Lake Wantanamanabikiliki),因为我担心埃尔玛姨妈在需要时无法登录。现在,身为核物理学家的埃尔玛姨妈不太擅长记住密码,甚至根本不使用计算机。所以我想消除她的所有磨擦。再说一次,我不担心黑客,我只是不想犯错误的登录错误-我想知道谁来了,他们想要什么。

无论如何。
那么,如果我们对称地加密密码而不是使用单向哈希,那么这里的主要风险是什么?

  • 冒充用户?不,我已经接受了这种风险,这并不有趣。
  • 邪恶的管理员?嗯,也许......但同样,我不关心,如果有人可以模拟其他用户,内部或没有......反正恶意管理员是会得到你的密码,不管是什么 -如果您的管理员的坏了,它的游戏呢。
  • 提出的另一个问题是,身份实际上是在多个系统之间共享的。啊! 这是一个非常有趣的风险,需要仔细观察。
    首先,我断言不是共享的实际身份,而是证明或身份验证凭据。好的,因为共享密码将有效地允许我进入另一个系统(例如,我的银行帐户或gmail),所以这实际上是相同的身份,因此只是语义而已 ...除了不是。在这种情况下,身份由每个系统分别管理(尽管可能会有第三方id系统,例如OAuth-尽管如此,其与该系统中的身份是独立的,稍后再介绍)。
    这样,核心是这里存在的风险是,用户会愿意将其(相同)密码输入几个不同的系统中-现在,我(管理员)或我站点的任何其他黑客都可以访问Erma姑妈的核导弹站点密码。

您觉得这里有什么事吗?

这应该。

让我们从保护核导弹系统不是我的责任这一事实开始,我只是在建立一个frakkin家庭郊游场所(针对我的家人)。那么是谁的责任呢?嗯...核导弹系统怎么样?咄。
其次,如果我想窃取某人的密码(众所周知,某人在安全站点之间和非那么安全站点之间反复使用相同的密码)-为什么要打扰您的站点?还是正在努力进行对称加密?Goshdarnitall,我可以设置一个简单的网站,让用户注册以接收关于他们想要的任何非常重要的新闻... Puffo Presto,我“偷了”他们的密码。

是的,用户培训总是会回过头来咬我们,这不是吗?
而且您无能为力...即使您要在网站上对他们的密码进行哈希处理,并做TSA可以想到的其他事情,您也要保护他们的密码,而不是一意孤行,如果他们愿意保留的话将他们的密码混杂到他们碰到的每个站点中。甚至不必费力尝试。

换句话说,您不拥有他们的密码,因此不要尝试像您一样操作。

因此,作为一位老妇人,我亲爱的安全专家曾经问温迪:“风险在哪里?”

针对以上提出的一些问题,还有几点:

  • CWE并非法律,法规或标准。它是常见弱点的集合,即“最佳实践”的反面。
  • 共享身份的问题是一个实际的问题,但是这里的反对者误解了(或歪曲了)。这是在自身之间共享标识的问题(!),而不是在低价值系统上破解密码。如果要在低价值系统和高价值系统之间共享密码,则问题已经存在!
  • 顺便说一句,对于这些低价值系统和高价值银行系统,上一点实际上将指向使用OAuth之类的AGAINST
  • 我知道这只是一个例子,但是(不幸的是)FBI系统并不是最安全的系统。不太像猫咪的博客的服务器,但是它们也不能超过一些更安全的银行。
  • 加密密钥的拆分知识或双重控制并不仅在军事上发生,事实上,PCI-DSS现在基本上要求所有商人都提供,因此,它真的不是那么遥不可及(如果价值证明了这一点)。
  • 对于所有抱怨这样的问题的人来说,是什么使开发人员职业显得如此糟糕:正是这些回答使安全职业看起来更加糟糕。同样,需要以业务为中心的风险分析,否则您将变得毫无用处。除了错了。
  • 我想这就是为什么不聘请常规开发人员并在他身上承担更多安全责任,而无需训练有别于他人的思维以及寻找正确的权衡因素的一个好主意。没有冒犯,对于你们这里的那些人,我全力以赴-但需要进行更多的培训。

ew。多长时间的帖子...
但是要回答您的原始问题,@ Shane:

  • 向客户说明正确的做事方式。
  • 如果他仍然坚持,请解释更多,坚持,争论。如果需要,请发脾气。
  • 向他解释业务风险。细节很好,数据更好,现场演示通常是最好的。
  • 如果他仍然坚持并提出有效的商业理由-现在是您进行判断的时候了:
    该网站的价值低吗?这真的是有效的商业案例吗?对你来说足够好了吗?您是否可以考虑其他比有效商业原因大的风险?(当然,客户端不是恶意站点,就是这样)。
    如果是这样,那就继续吧。(在这种假设的情况下)进行必要的过程是不值得的工作,摩擦和浪费的使用。任何其他决定(同样在这种情况下)都是一个不好的权衡。

因此,底线和实际答案是-使用简单的对称算法对其进行加密,使用强大的ACL(最好是DPAPI等)保护加密密钥,对其进行记录,并让客户端(足够资深的人来做出决定)签名它。


5
你的低价值的网站之间共享“无”昂贵资产和Facebook / Gmail的/你的银行密码一个昂贵的资产,即使是在低价值的地点。
jammycakes

3
我认为这里的问题是上述用户组倾向于对来自许多不同安全级别(从银行到食谱博客)的所有应用程序使用相同的密码。因此,问题是,开发人员是否有责任保护用户,甚至保护他们自己。我肯定会说,是的!
ercan 2010年

7
很抱歉,身份本身一项高价值资产。没有例外,没有任何借口。无论您认为自己的网站有多小巧,都无关紧要。如果共享密码可以使黑客进入您用户的Facebook帐户,Gmail帐户,银行帐户等,则它就是身份。这与语义无关,但与后果无关。只要问任何人谁是受到了黑客攻击像这样的:theregister.co.uk/2009/08/24/4chan_pwns_christians
jammycakes

2
@Jacob,由于Erma在其他系统上的帐户已被盗用,您的客户将在哪个世界被起诉?即使您的客户严重疏忽(我所阐述的,这也不是给定的),并且除了无法证明其他系统因您而被违反的事实,也没有法律依据。从另一个系统上的一个系统索赔任何形式的损害。它将有偏见被扔出法庭,并轻视原告。但是,Erma可能因违反许多服务条款而过错...
AviD 2010年

5
@Jacob,那是非常错误的。仅仅因为密码恰好相同(这显然会违反您的ToS及其安全策略),所以将二者结合在一起并没有法律地位。那甚至是事实,证明它几乎是不可能的。顺便说一句,我还要指出,没有法律要求随机公司没有宽松的安全惯例,除非有特殊规定。最重要的是,密码是加密的(!),因此,松懈还远未得出结论。
AviD

21

中途房子怎么样?

使用高度加密的密码存储密码,并且不要启用重置。

无需重设密码,而是允许发送一次性密码(首次登录后必须立即更改)。然后让用户更改为所需的任何密码(如果选择,则使用前一个密码)。

您可以“出售”此作为重置密码的安全机制。


您知道,我曾在几种情况下使用过(通常这是我的中间立场),但我曾让人们告诉我,最终用户只是不会获得互动,因此支持需要能够“告诉他们他们的密码”,具体取决于该业务模型中的情况。我同意,虽然可能的话这是可取的。
Shane 2010年

您可以始终告诉您的客户其DB掉入邪恶之手的风险,并且他们可能会公开窃取密码。...周围有很多例子。
Oded 2010年

6
要求他们在“设计”上签字,并增加一条条款,即如果您警告过他们的事情确实发生了,他们将无法起诉您……至少您可以自己掩盖自己。
Oded

4
-1密码不应该被“加密”这是违反CWE-257的cwe.mitre.org/data/definitions/257.html

34
@Michael Brooks:无需反复投票和复制粘贴相同的评论;我们都知道这是不好的做法。Shane表示,尽管他在这件事上缺乏控制力,所以提出了下一个最好的建议。
Johannes Gorset 2010年

13

允许用户检索其原始密码的唯一方法是使用用户自己的公共密钥对其进行加密。然后只有该用户才能解密其密码。

因此,步骤将是:

  1. 用户在您的站点上注册(当然是通过SSL),而没有设置密码。自动登录或提供临时密码。
  2. 您提供存储其公共PGP密钥的功能,以供将来检索密码。
  3. 他们上传他们的公共PGP密钥。
  4. 您要求他们设置新密码。
  5. 他们提交密码。
  6. 使用可用的最佳密码哈希算法(例如bcrypt)对密码进行哈希处理。在验证下一次登录时使用它。
  7. 您使用公共密钥对密码进行加密,然后将其分开存储。

如果用户随后要求输入密码,则您将使用加密(而非散列)密码进行响应。如果用户不希望将来再次获取密码(他们只能将其重置为服务生成的密码),则可以跳过步骤3和7。


5
大多数用户没有PGP密钥(我仍然没有PGP密钥;经过20年的行业发展,我从未感到有这种需要),而且这并不是一个无障碍的过程。而且,私钥实际上实际上只是实际密码的代理。换句话说,这是密码的密码;一直都是乌龟。
罗伯特·哈维

1
@RobertHarvey的目标是允许用户检索其密码,而不允许站点员工或任何黑客获取密码。通过要求检索过程在用户自己的计算机上进行,您可以强制执行此操作。PGP可能有其他替代方法可以实现相同的目标。乌龟一直走下去(也许沿途有些大象),但我没有其他办法。对于一般人群(不太可能成为个人针对),将您的密码写在纸上,并且无法从服务中检索密码,这比我们目前更安全
Nicholas Shanks

我喜欢它,因为它迫使每个人都拥有PGP公钥,这很奇怪,这是非常道德的事情。
罗德韦克2014年

您可以生成一个并将其提供给用户。
My1 2016年

@RobertHarvey您可能是对的,这不是一个“无摩擦的过程”,但是对于高级用户而言,这可能是一项额外的服务,普通用户可以忽略它。至于关于PK是“密码的密码”的论点,请记住,从理论上讲,它可以适用于许多密码。您可能会为不同的服务使用不同的密码,并使用相同的密钥对所有密码进行加密。这样一来,PK不仅会是一个密码,更有价值。也许它以抽象方式可与密码管理器(?)相提并论。我现在还不清楚这可能会带来什么后果……
Kjartan

12

我认为您应该问自己的真正问题是:“我如何才能更好地说服人们?”


4
@sneg-好吧,我是一个非常有说服力的人,但是有时它是老板,有时是客户,所以我并不总是具有需要用一种或另一种方式说服他们的杠杆作用。我将在镜子中进行更多练习..;)
Shane 2010年

要说服您,除了您的能力和沟通技巧外,您实际上并不需要任何其他手段。如果您知道做某事的更好方法,但是人们不听,那就考虑一下。
z-boss

7
@ z-boss-显然您没有和/或有一些我乐于与之合作的硬汉。有时候,如果您的舌头上镀了金色并不重要,并且您可以在一天内为Google Chrome浏览器重新编程(可以说实际上可能使它有用),它们仍然不会动摇。
Shane 2010年

11

我有同样的问题。同样,我始终认为有人入侵了我的系统,这不是“如果”的问题,而是“时间”的问题。

因此,当我必须要做一个需要存储可恢复的机密信息(例如信用卡或密码)的网站时,我要做的是:

  • 加密方式:openssl_encrypt(字符串$ data,字符串$ method,字符串$ password)
  • 数据arg
    • 敏感信息(例如用户密码)
    • 必要时进行序列化,例如,如果信息是诸如多个敏感信息之类的数据数组
  • password arg:使用只有用户知道的信息,例如:
    • 用户车牌
    • 社会安全号码
    • 用户电话号码
    • 用户的母亲名称
    • 在注册时通过电子邮件和/或短信发送的随机字符串
  • 方法arg
    • 选择一种加密方法,例如“ aes-256-cbc”
  • 永远不要在数据库(或系统中的任何位置)中存储“密码”自变量中使用的信息

必要时只需使用“ openssl_decrypt()”函数并向用户询问答案即可。例如:“要接收密码,请回答以下问题:您的手机号码是多少?”

PS 1:切勿将数据库中存储的数据用作密码。如果您需要存储用户手机号码,则切勿使用此信息对数据进行编码。始终使用仅用户知道的信息或非亲属很难知道的信息。

PS 2:对于信用卡信息,例如“一键购买”,我要做的是使用登录密码。此密码在数据库(sha1,md5等)中进行了哈希处理,但是在登录时,我将纯文本密码存储在会话中或非持久(即在内存中)安全cookie中。该普通密码永远不会保留在数据库中,而是始终保留在内存中,并在本节末尾销毁。当用户单击“一键购买”按钮时,系统将使用此密码。如果用户使用诸​​如Facebook,Twitter等服务登录,那么我会在购买时再次提示密码(确定,这不是完全“点击”),或者使用用户用来登录的服务的一些数据(如Facebook ID)。


9

保护凭据不是二进制操作:安全/不安全。安全性完全与风险评估有关,并且是连续进行的。安全狂热者讨厌这样思考,但是一个丑陋的事实是,没有什么是绝对安全的。具有严格密码要求,DNA样本和视网膜扫描的散列密码更安全,但要付出开发和用户体验的代价。纯文本密码的安全性要差得多,但实现起来便宜(但应避免使用)。归根结底,归结为对违规的成本/收益分析。您可以根据要保护的数据的值及其时间值来实现安全性。

某人的密码泛滥成灾的代价是什么?给定系统中模拟的成本是多少?对于联邦调查局的计算机而言,代价可能是巨大的。对于鲍勃(Bob)的单页五页网站而言,费用可以忽略不计。专业人员为客户提供选择,并且在安全性方面,列出了任何实施的优势和风险。如果客户要求某些因不遵守行业标准而可能使他们面临风险的事情,这是双重的。如果客户明确要求双向加密,那么我将确保您记录异议,但这不会阻止您以已知的最佳方式实施。归根结底,这是客户的钱。是,

如果您使用双向加密存储密码,那么安全性全归结于密钥管理。Windows提供了将访问证书的私钥限制为管理帐户和密码的机制。如果您托管在其他平台上,则需要查看在这些平台上可以使用的选项。正如其他人所建议的,您可以使用非对称加密。

我知道没有法律(英国也没有《数据保护法》)明确指出必须使用单向哈希存储密码。这些法律中的任何一项的唯一要求就是简单地采取合理的步骤以确保安全。如果对数据库的访问受到限制,那么即使是纯文本密码也可以在这种限制下合法地合格。

但是,这确实揭示了另一个方面:法律优先权。如果法律上的优先权表明您必须在给定构建系统的行业的情况下使用单向哈希,那么那就完全不同了。那是您用来说服客户的弹药。除非是提供合理风险评估的最佳建议,否则您的异议应记录在案,并以可以满足客户需求的最安全方式实施该系统。


10
您的答案完全忽略了密码可在多个站点/服务之间重复使用,这是本主题的核心,也是将可恢复密码视为严重缺陷的原因。安全专业人员不会将安全决策委派给非技术客户;专业人士知道他的职责超出了付费客户,并且不提供高风险和回报的选择。-1表示夸张的言论和事实的轻率-甚至没有真正回答问题。
Aaronaught

4
同样,您完全忽略了风险评估。要使用您的论点,您不能仅止于1次哈希。您还必须包括复杂性要求,密码长度,密码重用限制等。如果系统不相关且坦率地说,争辩说用户将使用哑密码或重用密码不足以作为业务理由,我确实回答了这个问题。简短的答案:推动使用std实现,如果您否决并继续前进,请记录您的反对意见。
托马斯(Thomas)2010年

7
再次重申,对于低价值系统,这都不重要! 用户密码的值与系统上用户帐户的值无关。 这是一个秘密,您必须始终保持这一秘密。我希望我可以再给-1来表示您仍然不了解这里的问题。
Aaronaught

5
风险评估是核心问题。密码重用只是更多问题中的一个潜在问题。为什么不要求有钥匙扣?为什么不要求该人开车去您的办公室登录?如果没有对风险的合理评估,就无法回答这些问题。在您的世界中,一切都是风险,因此每个系统都需要FBI级别的登录安全性。这根本不是现实世界的工作方式。
托马斯

7
这里唯一清楚的是,您的整个论点只不过是“滑坡”谬论而已,并且您正试图用诸如“风险评估”之类的流行语来吸引读者,以掩盖这一事实。请放心,无论“ FBI”使用什么系统,它都比bcrypt哈希和最小密码长度安全得多。如果需要行业标准的身份验证系统使我成为“安全狂热者”,那么我想我是一个狂热者。就个人而言,让我知道有人愿意为金钱牺牲我的安全感让我感到痛苦。那是不道德的
Aaronaught

8

将用户的安全性问题的答案作为加密密钥的一部分,并且不要将安全性问题的答案存储为纯文本格式(而是将其哈希化)


用户也可以不同地回答问题。有些问题要求较长的答案,以后很容易重新表述。
Monoman 2010年

5
安全问题是个坏主意。一旦信息泄露,您如何让您的妈妈改姓氏?另请参阅Peter Gutmann的Engineering Security
jww 2013年

7

我实施的是多因素身份验证系统,因此对我而言,很自然地认为您可以重置或重建密码,而暂时仅使用一个较少的因素就重置/娱乐工作流程对用户进行身份验证。特别是,如果建议的工作流程的时间窗口很短,则使用OTP(一次性密码)作为一些其他因素可以减轻很多风险。我们已经为智能手机(大多数用户已经整天随身携带)实施了软件OTP生成器,并取得了巨大的成功。在抱怨商业插件出现之前,我要说的是,当密码不是用于认证用户的唯一因素时,我们可以降低保持密码易于检索或重置的固有风险。


与在许多站点上看到的令人毛骨悚然的“秘密问题”系统相比,从多因素身份验证系统中暂时删除一个因素确实是一种更安全的重置密码的方法。但是对于以可恢复的格式存储密码,我不确定它有什么帮助,除非您以某种方式使用第二个因素对第一个因素进行加密或混淆,而且我不确定使用SecurID之类的方法是如何实现的。你可以解释吗?
亚伦诺特(Aaronaught)2010年

@Aaronaught我的意思是,如果“要求”您拥有可恢复的密码,则它不是唯一的身份验证因素,则固有的风险会降低,并且如果最终工作流重用了那些会导致身份验证的因素,则对最终用户来说也更容易他/她已经拥有并具有当前访问权限,而不是试图记住可能还忘记了的“秘密答案”或使用时间限制的链接或临时密码(都是通过不安全的渠道发送的)(除非您将S-MIME与客户端证书一起使用,或者PGP,特别是在管理正确的关联和到期/替换上都产生了费用)
Monoman 2010年

1
我想所有这些都是对的,但是从一开始,公众妥协的风险很小。可恢复密码的更严重问题是内部安全性,并可能使心怀不满的员工放弃成千上万个客户的电子邮件密码,或者弯曲的首席执行官将其出售给网络钓鱼者和垃圾邮件发送者。两因素身份验证非常适合于防止身份盗用和密码猜测,但是对于保持实际密码数据库的安全性而言,它并没有真正起到很大作用。
亚罗诺(Aaronaught)2010年

5

抱歉,但是只要您有某种方法可以解密他们的密码,就不可能保证其安全。苦战,如果输了,就要战斗。


5

刚刚遇到了这个有趣而激烈的讨论。最令我惊讶的是,对以下基本问题的关注很少:

  • Q1。用户坚持访问纯文本存储密码的实际原因是什么?为什么它这么有价值?

用户年长或年轻的信息并不能真正回答该问题。但是,如果没有正确理解客户的关注,如何做出业务决策呢?

现在为什么重要呢?因为如果客户请求的真正原因是很难使用的系统,那么解决确切原因可能会解决实际问题吗?

由于我没有此信息,也无法与这些客户交谈,因此我只能猜测:这与可用性有关,请参见上文。

我看到的另一个问题是:

  • Q2。如果用户最初不记得密码,为什么旧​​密码很重要?

这是可能的答案。如果您有一只叫“ miaumiau”的猫,并用她的名字作为密码,但是忘记了密码,您是否想提醒它是什么,还是想发送诸如“#zy * RW(ew)”之类的东西?

另一个可能的原因是用户认为输入新密码很困难!因此,将旧密码发送回给人的幻想是,将她从繁琐的工作中解救出来。

我只是想了解原因。但是,无论原因是什么,这都是必须解决的原因而不是原因。

作为用户,我希望事情变得简单!我不想努力!

如果我登录新闻网站阅读报纸,我想输入1111作为密码并通过!

我知道这是不安全的,但是我如何处理有人可以访问我的“帐户”呢?是的,他也可以阅读新闻!

该网站是否存储我的“私人”信息?我今天读的新闻?那是网站的问题,不是我的!该网站是否向经过身份验证的用户显示私人信息?然后不要显示在第一位!

这仅仅是为了说明用户对问题的态度。

综上所述,我不认为如何“安全地”存储纯文本密码(我们知道这是不可能的)的问题,而是如何解决客户的实际问题。


4

处理丢失/忘记的密码:

没有人应该能够恢复密码。

如果用户忘记密码,则他们至少必须知道其用户名或电子邮件地址。根据要求,在“用户”表中生成一个GUID,并发送一封电子邮件,其中包含一个链接,该链接包含该guid作为用户电子邮件地址的参数。

链接后面的页面会验证参数guid是否确实存在(可能带有某些超时逻辑),并要求用户输入新密码。

如果您需要热线帮助用户,请将一些角色添加到您的赠款模型中,并允许热线角色临时以标识用户身份登录。记录所有此类热线登录。例如,Bugzilla为管理员提供了这种模拟功能。


GUID是个坏主意,不够随机且容易被暴力破解。有这个其他的问题,请参见stackoverflow.com/questions/664673/...
狂热的

3

在注册之前通过电子邮件发送纯文本密码,然后对其进行加密和丢失该怎么办?我见过很多网站都这样做,从用户电子邮件中获取该密码比将其保留在服务器/计算机上更为安全。


我不认为电子邮件比其他任何系统都更安全。尽管这确实使我摆脱了法律上的顾虑,但是仍然存在有人丢失/删除电子邮件的问题,现在我回到第一个问题。
Shane 2010年

提供密码重置并通过电子邮件发送纯文本密码。我认为这是您可以做的最多事情,而无需您自己保留密码的副本。
casraf 2010年

这是一个绝对可怕的想法。它既无效(许多用户在阅读后实际上删除了电子邮件),又比您要防止的情况更糟(因为电子邮件默认情况下是未加密的,并且会通过不可信的网络传递)。最好建议用户自己记录密码,至少向自己发送一封电子邮件,信息永远不会比电子邮件服务器更远,而不是整个Internet!
Ben Voigt,2016年

3

如果您不能仅仅拒绝存储可恢复密码的要求,那么这将成为您的反论点。

我们可以适当地对密码进行哈希处理并为用户建立重置机制,也可以从系统中删除所有个人身份信息。您可以使用电子邮件地址来设置用户首选项,仅此而已。使用Cookie可以自动提取以后的访问偏好,并在合理的时间后丢弃数据。

密码策略经常忽略的一个选项是是否真的需要密码。如果您的密码策略唯一要做的就是引起客户服务电话,也许您可​​以摆脱它。


只要您拥有与密码关联的电子邮件地址,并且该密码是可恢复的,由于密码重用,您就有可能泄露该电子邮件地址的密码。这实际上是这里的主要问题。确实没有其他重要的个人身份信息。
亚罗诺(Aaronaught)2010年

1
你完全错过了我的观点。如果您确实不需要密码,请不要收集密码。开发人员经常陷入“这就是我们做事的方式”的思维方式。有时,它有助于排除先入为主的观念。
2010年

2

用户是否真的需要恢复(例如被告知)他们忘记了什么密码,还是仅需要能够进入系统?如果他们真正想要的是用于登录的密码,为什么没有一个例程将简单的旧密码(无论是什么)更改为支持人员可以提供给丢失密码的人的新密码?

我已经使用了可以做到这一点的系统。支持人员无法知道当前密码是什么,但是可以将其重置为新值。当然,所有这样的重设都应该记录在某个地方,良好的做法是向用户生成一封电子邮件,告诉他密码已被重设。

另一种可能性是同时拥有两个密码,以允许访问一个帐户。一个是用户管理的“普通”密码,另一个是仅由支持人员知道且所有用户都相同的万能钥匙/万能钥匙。这样,当用户遇到问题时,支持人员可以使用主密钥登录帐户,并帮助用户将其密码更改为任何密码。不用说,所有具有主密钥的登录名也应由系统记录。作为一项额外措施,每当使用主密钥时,您也可以验证支持人员的凭据。

-EDIT-回应关于没有主密钥的评论:我同意这很糟糕,就像我认为允许除用户之外的任何人都可以访问该用户的帐户很糟糕。如果您查看问题,则整个前提是客户要求高度受威胁的安全环境。

主密钥不必像最初看起来那样糟糕。我曾经在一家国防工厂工作,在那里他们意识到大型计算机操作员在某些情况下必须具有“特殊访问权限”。他们只需将特殊密码放在密封的信封中,然后将其粘贴到操作员的办公桌上即可。要使用密码(操作员不知道),他必须打开信封。每次轮班更改时,值班主管的工作之一就是查看信封是否已打开,是否立即(由另一个部门)更改了密码,并将新密码放入了新的信封中,然后整个过程开始了再次。将向操作员询问他为什么打开它,并将事件记录下来以作记录。

虽然这不是我要设计的程序,但它确实有效,并提供了出色的责任感。一切都被记录和审查,加上所有操作员都获得了国防部的秘密许可,我们再也没有滥用任何权力。

由于审查和监督,所有运营商都知道,如果他们滥用了打开信封的特权,将被立即解雇,并可能受到刑事起诉。

因此,我想真正的答案是,如果一个人想做正确的事,那就聘请他们可以信任的人,进行背景调查并行使适当的管理监督和问责制。

但是再说一次,如果这个可怜的家伙的客户拥有良好的管理,他们就不会一开始就要求这样的安全性降低的解决方案,现在他们会吗?


主密钥具有极大的风险,支持人员将可以访问每个帐户-一旦您将该密钥提供给用户,他们便拥有主密钥并可以访问所有内容。
卡森·迈尔斯

万能钥匙是一个可怕的主意,因为如果有人发现了它(或意外地将其透露给他们),他们就可以利用它。由于按帐户设置密码重置机制非常可取。
Phil Miller'2

我很好奇,我以为Linux默认具有一个具有root级访问权限的超级用户帐户?这不是访问系统上所有文件的“主键”吗?
JonnyBoats

@JonnyBoats是的。这就是为什么像Mac OS X这样的现代Unix禁用root帐户的原因。
尼古拉斯·香克斯

@NicholasShanks:禁用root帐户,还是禁用root帐户的交互式登录?仍然有许多代码在无限制权限的情况下运行。
Ben Voigt

2

从我对该主题的了解不多,我相信,如果您使用登录名/密码构建网站,那么您甚至根本不会在服务器上看到纯文本密码。密码甚至在离开客户端之前都应进行散列处理,并可能加盐处理。

如果您从未看到明文密码,那么就不会出现检索问题。

另外,我从网络上收集(据说)某些算法(例如MD5)不再被认为是安全的。我无法判断自己,但这是需要考虑的事情。


1

在独立服务器上打开数据库,并为每个需要此功能的Web服务器提供加密的远程连接。
它不一定是关系数据库,它可以是具有FTP访问权限的文件系统,它使用文件夹和文件而不是表和行。
如果可以,授予Web服务器只写权限。

像普通人一样,将不可恢复的密码加密存储在站点的数据库中(我们称其为“ pass-a”):)
在每个新用户(或更改密码)上,将密码的普通副本存储在远程数据库中。使用服务器的ID,用户的ID和“ pass-a”作为此密码的组合键。您甚至可以对密码使用双向加密,以使晚上的睡眠更好。

现在,为了使某人同时获得密码及其上下文(站点ID +用户ID +“ pass-a”),他必须:

  1. 入侵网站的数据库以获得一对(“ pass-a”,用户ID)。
  2. 从一些配置文件中获取网站的ID
  3. 查找并破解远程密码数据库。

您可以控制密码检索服务的可访问性(仅将其作为安全的Web服务公开,每天仅允许进行一定量的密码检索,手动进行操作等),甚至为此“特殊安全安排”收取额外费用。
密码检索数据库服务器非常隐蔽,因为它不提供许多功能,并且可以得到更好的保护(您可以严格调整权限,流程和服务)。

总而言之,您使黑客的工作更加艰辛。在任何一台服务器上发生安全漏洞的机会仍然是相同的,但是有意义的数据(帐户和密码的匹配)将很难收集。


3
如果应用服务器可以访问它,那么有权访问该应用服务器的任何人(无论是黑客还是恶意内部人员)也可以访问它。这提供了零附加安全性。
molf 2010年

1
此处增加的安全性是应用程序服务器的数据库不保存密码(因此需要再次破解-密码数据库),并且密码DB可以更好地保护其免受不规则活动的影响,因为您可以控制密码检索服务的可访问性。因此,您可以检测批量数据检索,每周更改检索SSH密钥,甚至不允许自动通过检索,并手动进行所有操作。该解决方案还适用于密码DB的任何其他内部加密方案(例如,公钥+私钥,盐等)。
阿米尔·阿拉德

1

您可能没有考虑过的另一种选择是允许通过电子邮件进行操作。这有点麻烦,但是我为需要用户“在系统外部”查看(只读)系统某些部分的客户端实施了此操作。例如:

  1. 注册用户后,他们就拥有完全访问权限(例如常规网站)。注册必须包含电子邮件。
  2. 如果需要数据或操作,并且用户不记得密码,他们仍然可以通过单击常规“ 提交 ”旁边的特殊“ 向我发送电子邮件以获取许可 ”按钮来执行操作。 ”按钮。
  3. 然后,请求将通过超链接发送到电子邮件,询问他们是否希望执行该操作。这类似于密码重置电子邮件链接,但是它执行一次动作而不是重置密码。
  4. 然后,用户单击“是”,它确认应该显示数据,还是应该执行操作,显示数据等。

正如您在评论中提到的那样,如果电子邮件被盗用,这将不起作用,但是它确实解决了@joachim关于不想重设密码的评论。最终,他们将不得不使用密码重设,但是他们可以在更方便的时间进行此操作,或者根据需要在管理员或朋友的帮助下进行。

该解决方案的一个变种是将操作请求发送给第三方受信任的管理员。在老年人,智障人士,非常年轻或其他困惑的用户的情况下,这将是最好的选择。当然,这需要这些人员值得信任的管理员来支持他们的行为。


1

照常添加并哈希用户密码。登录用户时,既要允许用户输入密码(在加盐/散列后),也要允许用户实际输入的内容也匹配。

这允许用户输入其密码,但也允许他们输入密码的加盐/散列版本,这是某人将从数据库中读取的内容。

基本上,将加盐/散列密码也设置为“纯文本”密码。


您为什么认为有必要将用户直接输入的内容与数据库中存储的哈希密码进行比较?那给您什么样的功能?同样,在执行此操作时,在用户输入的密码和数据库中的哈希密码之间应用恒定时间比较功能也非常重要。否则,几乎不可能根据时序差异确定哈希密码。
Artjom B.

1
@ArtjomB。该问题询问如何保护用户密码,同时还允许客户支持(CS)通过输入忘记的密码来与用户通话/发送电子邮件。通过使散列版本可用作纯文本密码,CS可以读出它并让用户使用它来代替忘记的密码。CS还可以使用它以用户身份登录并帮助他们完成任务。这也使喜欢自动忘记密码系统的用户受到保护,因为他们输入和使用的密码是经过哈希处理的。
艾略特

我知道了。我还没有完整阅读这个问题。仍然需要使用恒定时间比较来防止整个系统的严重损坏。
Artjom B.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.