我应该如何合乎道德地处理用户密码存储,以便以后进行明文检索?

How should I ethically approach user password storage for later plaintext retrieval?

提问人:Shane 提问时间:2/18/2010 最后编辑:user115014Shane 更新时间:5/5/2017 访问量:88035

问:

已锁定。这个问题及其答案被锁定,因为这个问题偏离了主题,但具有历史意义。它目前不接受新的答案或交互。

随着我继续构建越来越多的网站和 Web 应用程序,我经常被要求存储用户的密码,以便在用户遇到问题时可以检索它们(通过电子邮件发送忘记的密码链接、通过电话引导他们完成等)。如果可以的话,我会与这种做法进行激烈的斗争,并且我做了很多“额外”编程,以使密码重置和管理协助成为可能,而无需存储他们的实际密码。

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

在一个完美的世界里,人们会经常更新密码,而不是在许多不同的网站上重复它们——不幸的是,我知道很多人拥有相同的工作/家庭/电子邮件/银行密码,甚至在他们需要帮助时免费将其提供给我。如果我的数据库安全程序由于某种原因失败,我不想成为他们财务死亡的责任人。

从道德和伦理上讲,我觉得有责任保护一些用户可以成为他们的生计的东西,即使他们对待它的尊重要少得多。 我敢肯定,对于加盐哈希和不同的编码选项,有很多途径可以接近和提出论据,但是当您必须存储它们时,是否有单一的“最佳实践”?在几乎所有情况下,我都在使用PHP和MySQL,如果这对我应该处理细节的方式有任何影响。

赏金的其他信息

我想澄清一下,我知道这不是你想做的事情,在大多数情况下,拒绝这样做是最好的。然而,我不是在寻找关于采取这种方法的优点的讲座,我正在寻找如果你采取这种方法的最佳步骤。

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

在此类系统中,如果没有为用户提供这种级别的访问帮助,这些人口统计数据的流失率可能会阻碍应用程序,因此请在回答时牢记这样的设置。

感谢大家

这是一个有趣的问题,有很多争论,我很喜欢。最后,我选择了一个既保留了密码安全性(我不必保留纯文本或可恢复密码)的答案,又使我指定的用户群能够登录系统,而不会出现我从普通密码恢复中发现的主要缺点。

与往常一样,出于不同的原因,我希望将大约 5 个答案标记为正确,但我必须选择最好的一个——其余的都得到了 +1。谢谢大家!

另外,感谢 Stack 社区中为这个问题投票和/或将其标记为收藏夹的每个人。我把达到 100 票作为一种赞美,并希望这次讨论能帮助到与我有同样担忧的其他人。

安全 -加密密码 -存储

评论

155赞 stefanw 2/18/2010
我想他知道这不好。他仍在按照规定的要求寻找最佳解决方案。
33赞 rook 2/18/2010
归根结底,您要做的就是仔细实现一个可避免的漏洞。
20赞 Shane 2/18/2010
@Michael Brooks - 我想让你知道,我完全同意 CWE-257,并且每次我被要求将密码恢复为明文时,我都很乐意逐字引用。然而,在现实中,客户和用户很少对NIST法规感兴趣,只是希望我无论如何都这样做。90%的时间我可以说服他们,但在这10%的时间里,当我不能说服他们时,我试图确定最佳行动方案——在这些情况下,CWE-257在我手中是灰烬(不幸的是)。
81赞 Aaronaught 2/24/2010
@AviD:系统的“低价值”与这个问题完全无关,因为人们会重复使用他们的密码。为什么人们不能理解这个简单的事实?如果您破解了某些“低价值”系统上的密码,则可能会有多个用于其他“高价值”系统的有效密码。
20赞 Aaronaught 2/24/2010
另一点也被掩盖了,我刚刚在我的回答的评论流中提到:你怎么知道提出这些要求的人是值得信赖的?如果“可用性”借口只是一个幌子,掩盖了在未来某个时候窃取密码的真实意图怎么办?你的天真可能只是让客户和股东损失了数百万美元。安全专家必须重复多少次才能最终陷入困境:最常见和最严重的安全威胁始终是内部威胁。

答:

21赞 Oded 2/18/2010 #1

中途之家怎么样?

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

允许发送一次性密码(必须在首次登录后立即更改),而不是重置密码。然后,让用户更改为他们想要的任何密码(如果他们选择,则为前一个密码)。

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

评论

0赞 Shane 2/18/2010
你知道,我在几种情况下都使用过它(通常这是我的中间立场),但我有人告诉我,最终用户只是不会得到交互,并且由于该业务模型中的情况,支持需要能够“告诉他们他们的密码”。我同意,如果可能的话,这是可取的。
0赞 Oded 2/18/2010
您可以随时告诉您的客户他们的数据库落入坏人之手的风险以及他们获得被盗密码的公开......周围有很多例子。
6赞 Oded 2/18/2010
要求他们在“设计”上签字,并附加一个条款,即如果您警告他们的事情确实发生了,他们就不能起诉您......至少那时你遮盖了自己。
4赞 rook 2/18/2010
-1 密码永远不应该被“加密” 这违反了 CWE-257 cwe.mitre.org/data/definitions/257.html
34赞 Johannes Gorset 2/18/2010
@Michael Brooks:没有必要一遍又一遍地对同一条评论投反对票和复制粘贴;我们都知道这是不好的做法。不过,Shane表示,他在这件事上缺乏影响力,因此正在提出下一个最好的事情。
206赞 stefanw 2/18/2010 #2

您可以使用公钥加密密码 + 盐。对于登录,只需检查存储的值是否等于从用户输入 + 盐计算的值。如果有一段时间,当密码需要以明文形式恢复时,您可以使用私钥手动或半自动解密。私钥可以存储在其他地方,也可以对称加密(这需要人工交互来解密密码)。

我认为这实际上有点类似于 Windows 恢复代理的工作方式。

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

评论

34赞 rook 2/18/2010
-1 密码永远不应该被“加密” 这违反了 CWE-257 cwe.mitre.org/data/definitions/257.html
100赞 stefanw 2/18/2010
1. 问题指出密码应该可以恢复为明文,因此这是一项要求。2.我在这里使用非对称加密,而不是对称加密。解密密钥对于日常操作不是必需的,可以保存在银行保险箱中。链接中的论证是有效的,但不适用于这种情况。
57赞 stefanw 2/18/2010
没错,但你能同意,考虑到要求,这是最负责任的方式吗?你可以用你的 CWE-257 打我一整天,它不会改变安全存储和处理凭据并在需要时能够将它们恢复到原始形式的有趣问题。
10赞 Aaronaught 2/19/2010
Windows Recovery Agent 在这里也是一个糟糕的示例,因为它处理的是实际加密,而不是密码管理。加密密钥与密码不同;围绕每个规则和做法的规则和做法是完全不同的。加密和身份验证是不一样的。加密是为了保护隐私 - 密钥用于保护数据。身份验证用于标识,其中密钥是数据(它是身份验证过程中的一个因素)。所以我再说一遍,加密和身份验证是不一样的。你不能有效地将一个原则应用于另一个原则。
16赞 sfussenegger 2/24/2010
+1 执着地坚持CWE-257的意义何在?这是一个弱点 (CWE),而不是漏洞 (CVE)。将可恢复密码与缓冲区溢出进行比较就像比较苹果和橙子。只需确保客户理解问题所在(让他签署一些这样的东西 - 否则如果有问题,他可能不记得任何事情)然后继续。此外,所需的安全措施取决于系统的价值和潜在的攻击风险。如果成功的攻击者只能取消某些时事通讯订阅,则没有理由争论任何问题。
5赞 Steven Sudit 2/18/2010 #3

对不起,但只要你有办法解码他们的密码,它就不可能是安全的。苦战,如果你输了,CYA。

12赞 z-boss 2/18/2010 #4

我认为你应该问自己的真正问题是:“我怎样才能更好地说服别人?

评论

4赞 Shane 2/18/2010
@sneg - 嗯,我是一个很有说服力的人,但有时是老板,有时是客户,所以我并不总是有说服他们所需的影响力。不过,我会在镜子里多练习一些。;)
0赞 z-boss 2/19/2010
为了令人信服,除了你的能力和沟通技巧之外,你真的不需要任何杠杆。如果你知道做某事的更好方法,但人们不听......想想吧。
7赞 Shane 2/26/2010
@z老板 - 显然你没有和我有幸合作过的一些顽固的头脑一起工作过。有时,如果你的舌头镀上了金子,你可以在一天内重新编程谷歌浏览器(这实际上可能使它有用),它们仍然不会让步。
131赞 user207421 2/18/2010 #5

不要放弃。你可以用来说服你的客户的武器是不可否认性。如果您可以通过任何机制重建用户密码,那么您已经为他们的客户提供了合法的不可否认性机制,他们可以拒绝依赖于该密码的任何交易,因为供应商无法证明他们没有重建密码并自行进行交易。如果密码被正确地存储为摘要而不是密文,这是不可能的,因为最终客户端要么自己执行了交易,要么违反了他对密码的注意义务。无论哪种情况,这都将责任完全归咎于他。我曾经处理过数亿美元的案件。不是你想弄错的事情。

评论

2赞 Vinko Vrsalovic 3/1/2010
Web服务器日志在法庭上不算数?或者在这种情况下,它们也会被认为是伪造的?
10赞 AviD 3/2/2010
@Vinko Vrsalovic 的说法,Web 服务器日志不应该在法庭上计算在内,为此,您需要证明不可否认性、真实性证明、证据链等,而 Web 服务器日志显然不是。
7赞 user207421 3/2/2010
完全。供应商必须证明只有客户才能执行该交易。Web 服务器日志不会这样做。
0赞 Sablefoste 12/2/2015
可以这么说,并非所有密码实际上都是“交易”所必需的。假设该网站用于开发网页书签列表。在这种情况下,责任限额(通常在注册网站时在条款和条件中注明)为零,因为没有金融交易。如果网站没有影响他人的操作,那么最多,数据就会丢失给被黑的用户。该公司受到T&C的保护。
1赞 user207421 12/9/2015
@Sablefoste 在该网站上。如果用户在其他地方使用相同的密码,则会产生泄露其私人凭据的风险。如果你从不参与练习,你就不会引起问题。
8赞 Rob Fonseca-Ensor 2/18/2010 #6

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

评论

0赞 Monoman 10/13/2010
用户也可以以不同的方式回答问题。有些问题需要更长的答案,以后很容易改写。
5赞 jww 12/30/2013
安全问题是个坏主意。一旦信息泄露,你如何让你的妈妈改变她的婚前姓氏?另请参阅 Peter Gutmann 的 Engineering Security
42赞 Phil H 2/18/2010 #7

Michael Brooks 对 CWE-257 直言不讳——无论您使用哪种方法,您(管理员)仍然可以恢复密码。那么这些选项怎么样:

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

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

评论

8赞 Christopher Creutzig 2/24/2010
而且,当然,您可以使用任何秘密拆分技术来要求贵公司的多个人进行解密。但是,这些都不能满足能够向用户发送密码或让一些普通的一级电话支持者引导他们登录的原始要求。
4赞 devio 2/18/2010 #8

处理丢失/忘记的密码:

任何人都不应该能够恢复密码。

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

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

如果您需要热线帮助用户,请向授权模型添加一些角色,并允许热线角色以已识别用户的身份临时登录。记录所有此类热线登录信息。例如,Bugzilla 为管理员提供了这样的模拟功能。

评论

0赞 AviD 2/23/2010
GUID 是个坏主意,不够随机,容易被暴力破解。这还有其他问题,请参阅 stackoverflow.com/questions/664673/...
589赞 Aaronaught 2/19/2010 #9

想象一下,有人委托建造了一座大型建筑——比方说,一个酒吧——并发生了以下对话:

建筑师:对于这种规模和容量的建筑,你需要在这里、这里和这里设置消防通道。
客户:不,这太复杂了,维护成本太高了,我不想要任何侧门或后门。
建筑师:先生,消防通道不是可选的,根据城市的消防法规是必需的。
客户:我不是付钱给你争论的。按照我的要求去做。

然后,建筑师会问如何合乎道德地建造这座没有消防通道的建筑吗?

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

建筑师:如果没有消防通道,这栋建筑就无法建造。你可以去找任何其他有执照的专业人士,他会告诉你同样的事情。我现在要走了;当你准备好合作时,给我回电话。

计算机编程可能不是一个有执照的职业,但人们似乎经常想知道为什么我们的职业没有得到与土木或机械工程师相同的尊重——好吧,不要再看了。这些职业,当被交给垃圾(或完全危险)的要求时,只会拒绝。他们知道这不是说“好吧,我尽力了,但他坚持,我必须按照他说的去做”的借口。他们可能会因为这个借口而失去执照。

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

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

评论

124赞 Shane 2/19/2010
@Aaronaught - 我认为这是一个公平而有效的观点,但让我把它扭曲到你身上。你作为员工正在为一家公司做一个项目,你的老板说“这是我们系统的要求”(无论出于什么原因)。你是否满怀义愤地离开了工作岗位?我知道,当我完全控制时,有义务承担责任——但如果一家公司选择冒着审计失败或责任的风险,那么我有责任牺牲我的工作来证明一个观点,还是我寻求最好和最安全的方式去做他们所说的?只是扮演魔鬼的代言人..
44赞 Steven Sudit 2/19/2010
我不是律师,但请考虑一下。如果你的主管命令你做一些违背公司利益的事情,比如让他们承担容易避免的责任,你的工作是服从还是礼貌地拒绝?是的,他们是你的老板,但他们有自己的老板,即使是投资者。如果你越过他们的头,当你的安全漏洞被利用时,谁的头会滚动?只是要考虑的事情。
68赞 Aaronaught 2/24/2010
开发人员总是试图说我们的工作比其他人难得多,因为我们的垃圾需求一直在变化。嗯,这是一个完美的例子。我们的职业迫切需要一个骨干。我们的职业迫切需要能够说“不,这不是一个可接受的要求,这不是我可以真诚地发展的东西,你可能是我的客户/雇主,但我对你的客户和公众负有职业责任,如果你想做到这一点,那么你将不得不寻找其他地方。
36赞 Aaronaught 2/24/2010
@sfussenegger:你不需要知道背景。这是不可接受的。您假设客户是 100% 值得信赖的 - 如果他特别要求此要求,以便他以后可以使用密码怎么办?安全性是为数不多的在开发中刻在石头上的项目之一。有些事情你只是不做,存储可恢复的密码就是其中的十个。
37赞 Aaronaught 3/1/2010
好的,让我们在此时此地进行风险评估。“如果您以可恢复的形式存储密码,您将产生密码被盗的不小风险。至少一些用户可能会对他们的电子邮件和银行帐户使用相同的密码。如果密码被盗,银行账户被耗尽,它可能会成为头条新闻,没有人会再和你做生意,你很可能会被起诉。我们现在可以减少废话了吗?你把“纳粹”这个词带进去的事实清楚地表明你没有理智。
25赞 AviD 2/23/2010 #10

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

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

因此,我建议另一种解决方案:
根据系统的价值,并且仅当系统具有适当的低价值且没有“昂贵”资产(包括身份本身)时,并且存在有效的业务需求,使适当的流程变得不可能(或足够困难/昂贵),并且让客户了解所有注意事项......
然后,简单地允许可逆加密,而不需要跳过特殊的箍。
我只是说根本不打扰加密,因为它的实施非常简单/便宜(即使考虑通过的密钥管理),并且它确实提供了一些保护(超过实施它的成本)。此外,值得研究如何向用户提供原始密码,无论是通过电子邮件,在屏幕上显示等。 由于这里的假设是被盗密码的价值(即使总体上)非常低,因此这些解决方案中的任何一个都可以是有效的。


由于在不同的帖子和单独的评论线程中进行了热烈的讨论,实际上是几次热烈的讨论,我将添加一些澄清,并回应这里其他地方提出的一些非常好的观点。

首先,我认为这里的每个人都清楚,允许检索用户的原始密码是不好的做法,通常不是一个好主意。这根本没有争议......
此外,我要强调的是,在许多情况下,不,大多数情况下——这真的是错误的,甚至是肮脏的、令人讨厌的和丑陋的

然而,问题的关键在于原则是否有任何情况可能没有必要禁止这样做,如果是,如何以适合情况的最正确方式这样做。

现在,正如@Thomas、@sfussenegger和其他一些人提到的,回答这个问题的唯一正确方法是对任何给定(或假设的)情况进行彻底的风险分析,了解什么是利害攸关的,保护多少,以及还有哪些其他缓解措施来提供这种保护。
不,这不是一个流行语,这是真实安全专业人员的基本、最重要的工具之一。最佳实践在某种程度上是好的(通常作为没有经验和黑客的指南),在那之后,深思熟虑的风险分析接管了。

你知道,这很有趣——我一直认为自己是安全狂热分子之一,不知何故,我站在那些所谓的“安全专家”的对立面......好吧,事实是 - 因为我是一个狂热分子,并且是一个真正的现实生活中的安全专家 - 我不相信在没有最重要的风险分析的情况下滔滔不绝地喋喋不休
“当心安全狂热者,他们迅速应用他们工具带中的所有东西,而不知道他们正在防御的实际问题是什么。更高的安全性并不一定等同于良好的安全性。
风险分析和真正的安全狂热者会指出,基于风险、潜在损失、可能的威胁、补充缓解措施等,进行更明智的、基于价值/风险的权衡。任何“安全专家”如果不能指出合理的风险分析作为其建议的基础,或支持逻辑权衡,而是宁愿在不了解如何进行风险分析的情况下滔滔不绝地滔滔不绝地滔滔不绝地进行教条和 CWE,那么他们都是安全黑客,他们的专业知识不值得他们打印的卫生纸。

事实上,这就是我们得到机场安检的荒谬之处。

但在我们讨论在这种情况下要做出的适当权衡之前,让我们先看看明显的风险(很明显,因为我们没有关于这种情况的所有背景信息,我们都在假设 - 因为问题是可能存在什么假设情况......
让我们假设一个低价值的系统,但又不至于是公共访问——系统所有者希望防止随意冒充,但“高”安全性并不像易用性那么重要。(是的,接受任何精通脚本的孩子都可以入侵该网站的风险是一种合理的权衡......等等,APT现在不是很流行吗......?
举个例子,假设我正在为一个大型家庭聚会安排一个简单的地点,让每个人都可以集思广益,决定我们今年想去哪里露营。我不太担心某个匿名黑客,甚至弗雷德表弟一再建议她回到旺塔纳马纳比基利基湖,就像我担心艾尔玛阿姨在需要时无法登录一样。现在,作为核物理学家的艾尔玛阿姨不太擅长记住密码,甚至根本不擅长使用电脑......所以我想为她消除所有可能的摩擦。同样,我不担心黑客攻击,我只是不想犯错误登录的愚蠢错误——我想知道谁来了,他们想要什么。

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

  • 冒充用户?不,我已经接受了这种风险,没什么意思。
  • 邪恶的管理员?好吧,也许......但同样,我不在乎是否有人可以冒充另一个用户,内部或否......无论如何,恶意管理员无论如何都会获得您的密码 - 如果您的管理员变坏了,无论如何游戏都会结束。
  • 提出的另一个问题是,身份实际上是在多个系统之间共享的。啊!这是一个非常有趣的风险,需要仔细研究。
    首先,我要断言,共享的不是实际身份,而是证明或身份验证凭据。好吧,由于共享密码将有效地允许我进入另一个系统(例如,我的银行帐户或 gmail),这实际上是相同的身份,所以它只是语义......但事实并非如此。在此方案中,标识由每个系统单独管理(尽管可能存在第三方 ID 系统,例如 OAuth - 它仍然与此系统中的标识分开 - 稍后会详细介绍)。
    因此,这里的核心风险点是,用户会心甘情愿地将他的(相同)密码输入到几个不同的系统中——现在,我(管理员)或我网站的任何其他黑客都可以访问艾尔玛阿姨的核导弹站点密码。

嗯。

在你看来,这里有什么不对劲的地方吗?

它应该。

让我们从保护核导弹系统不是我的责任这一事实开始,我只是在建造一个 frakkin 家庭郊游网站(为我的家人)。那么是谁的责任呢?呃......核导弹系统怎么样?咄。
其次,如果我想窃取某人的密码(已知在安全站点和不太安全的站点之间反复使用相同密码的人)——我为什么要费心入侵您的网站?还是在为对称加密而苦苦挣扎?Goshdarnitall,我可以建立自己的简单网站,让用户注册以接收他们想要的任何非常重要的新闻......Puffo Presto,我“偷走”了他们的密码。

是的,用户教育总是会回来咬我们,不是吗?
你对此无能为力......即使你要在你的网站上对他们的密码进行哈希处理,并做TSA能想到的所有其他事情,你也会为他们的密码添加保护,而不是一分一毫,如果他们要继续混杂地将他们的密码粘贴到他们碰到的每个网站。甚至不要费心去尝试。

换句话说,你不拥有他们的密码,所以不要再试图像你一样行事了。

所以,我亲爱的安全专家,正如一位老太太曾经问温迪的一样,“风险在哪里?

在回答上述一些问题时,还有几点:

  • CWE不是法律、法规,甚至不是标准。它是常见弱点的集合,即“最佳实践”的反面。
  • 共享身份的问题是一个实际的问题,但被这里的反对者误解(或歪曲)。这是一个共享身份本身的问题(!),而不是破解低价值系统上的密码。如果您在低价值和高价值系统之间共享密码,那么问题已经存在!
  • 顺便说一句,前一点实际上反对对这些低价值系统和高价值银行系统使用 OAuth 等。
  • 我知道这只是一个例子,但(可悲的是)联邦调查局的系统并不是最安全的。不太像你猫的博客的服务器,但它们也没有超过一些更安全的银行。
  • 加密密钥的拆分知识或双重控制不仅发生在军队中,事实上,PCI-DSS现在基本上要求所有商家这样做,所以它不再那么遥远了(如果价值证明它是合理的)。
  • 对于那些抱怨这些问题让开发人员职业看起来如此糟糕的人:正是这样的答案让安全行业看起来更糟。同样,以业务为中心的风险分析是必需的,否则你会让自己变得毫无用处。除了错了。
  • 我想这就是为什么只让一个普通的开发人员把更多的安全责任放在他身上不是一个好主意,而没有训练他以不同的方式思考,并寻找正确的权衡。没有冒犯,对在座的你们这些人来说,我完全赞成——但更多的培训是有序的。

呼。多么长的帖子......
但要回答你最初的问题,@Shane:

  • 向客户解释正确的做事方式。
  • 如果他仍然坚持,再解释一些,坚持,争论。如果需要,发脾气。
  • 向他解释商业风险。细节很好,数字更好,现场演示通常是最好的。
  • 如果他仍然坚持,并提出有效的商业理由 - 是时候让你做出判断了:
    这个网站的价值低到没有价值吗?这真的是一个有效的商业案例吗?这对你来说足够好吗?您是否没有可以考虑的其他风险,这些风险会超过有效的业务原因?(当然,客户端不是恶意网站,但那是呃)。
    如果是这样,请继续前进。不值得付出努力、摩擦和丢失使用(在这种假设情况下)来实施必要的过程。任何其他决定(同样,在这种情况下)都是一个糟糕的权衡。

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

评论

5赞 jammycakes 2/23/2010
即使在低价值网站上,您的低价值网站与 Facebook/GMail/您的银行之间共享的密码也是一项昂贵的资产。
3赞 ercan 2/24/2010
我认为这里的问题是,上述用户组倾向于对来自许多不同安全级别(从银行到食谱博客)的所有应用程序使用相同的密码。所以问题是,开发人员是否有责任保护用户,甚至保护他们自己。我肯定会说,是的!
7赞 jammycakes 2/24/2010
对不起,身份本身就是一种高价值的资产。没有例外,没有借口。无论您认为您的网站有多小和无关紧要。如果共享密码允许黑客进入用户的 Facebook 帐户、Gmail 帐户、银行帐户等,则共享密码就是身份。这与语义无关,但与后果有关。只要问问任何受到黑客攻击的人,比如:theregister.co.uk/2009/08/24/4chan_pwns_christians
2赞 AviD 3/2/2010
@Jacob,在什么情况下,您的客户会因为 Erma 在其他系统上的帐户遭到入侵而被起诉?即使考虑到您的客户的重大过失(正如我所阐述的那样,这不是给定的),并且除了无法证明另一个系统因您的系统而被破坏这一事实之外,也没有可能的法律地位要求一个系统对另一个系统进行任何形式的损害赔偿。它将因偏见而被赶出法庭,并认定原告藐视法庭。但是,Erma 可能因违反多项服务条款而有过错......
5赞 AviD 3/2/2010
@Jacob,这是非常错误的。仅仅因为密码恰好相同(这显然违反了您的服务条款及其安全策略),就没有法律地位来验证两者。这甚至除了证明它几乎是不可能的事实之外。顺便说一句,我还要指出,除非有相关的特定法规,否则没有法律要求随机公司不要有松懈的安全措施。最重要的是,密码是加密的(!),所以松懈远非一个必然的结论。
94赞 jammycakes 2/23/2010 #11

您不能以合乎道德的方式存储密码以供以后进行明文检索。就这么简单。即使是 Jon Skeet 也无法从道德上存储密码以供以后进行明文检索。如果您的用户可以以某种方式以纯文本形式检索密码,那么在您的代码中发现安全漏洞的黑客也可能如此。这不仅仅是一个用户的密码被泄露,而是所有用户的密码都被泄露。

如果您的客户对此有疑问,请告诉他们存储可恢复的密码是违法的。无论如何,在英国,《1998年数据保护法》(特别是附表1,第二部分,第9段)要求数据控制者使用适当的技术措施来保护个人数据的安全,其中包括,如果数据被泄露可能造成的损害 - 这对于在网站之间共享密码的用户来说可能是相当大的。如果他们仍然难以理解这是一个问题的事实,请向他们指出一些真实世界的例子,比如这个例子。

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

以下是我写的几篇关于这个主题的博客文章:

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

评论

8赞 Shane 2/24/2010
@jimmycakes - 在低安全性系统上,这是一件好事,但是如果您要存储任何高价值的数据,那么您必须假设人员的电子邮件已经受到损害,并且向他们发送直接登录链接会损害您的系统。+1 用可行的替代方案回答我的问题,但指出了整个逻辑中的缺陷。我不希望 Payppal 发送直接登录链接。这听起来可能很偏执,但我总是认为我的电子邮件帐户已损坏 - 它让我保持诚实。;)
0赞 jammycakes 2/25/2010
当然,我希望我的银行至少给我打个电话并验证我的身份,然后再让我重置(而不是恢复)我的密码。我在这里概述的是我对任何地方的任何网站所期望的密码安全的绝对最低标准。
1赞 Peter Coulton 10/14/2010
忽略银行或PayPal,他们无论如何都不会受到您设置的限制;如果您认为他们的电子邮件已泄露,那么如何可能使用任何在线方法?如果您通过电子邮件发送生成的密码,那如何更安全?
0赞 jammycakes 10/14/2010
我不是在谈论获取单个人的密码,我是在谈论从数据库中获取多个密码。如果系统将密码存储为可恢复的纯文本,则黑客可能会编写脚本以从数据库中提取所有密码。
0赞 Jakub 4/26/2012
我想知道在电子邮件中发送链接/密码,通过未知的网络节点以普通形式通过网络......
3赞 casraf 2/24/2010 #12

在注册时通过电子邮件发送明文密码,然后再对其进行加密和丢失怎么办?我见过很多网站都这样做,从用户的电子邮件中获取该密码比将其留在您的服务器/组合上更安全。

评论

0赞 Shane 2/26/2010
我不认为电子邮件比任何其他系统更安全。虽然这确实消除了我手中的法律问题,但仍然存在有人丢失/删除电子邮件的问题,现在我又回到了原点。
0赞 casraf 2/26/2010
提供密码重置并通过电子邮件发送明文密码。我认为这是您在该主题上可以做的最多的事情,而无需自己保留密码的副本。
0赞 Ben Voigt 11/21/2016
这绝对是一个可怕的想法。它既无效(许多用户实际上在阅读后删除了电子邮件),又比您试图防范的更糟糕(因为电子邮件默认情况下是未加密的,并且通过不可信的网络)。最好建议用户自己记下密码,至少给自己发一封电子邮件,信息永远不会比电子邮件服务器更远,而不是整个互联网!
2赞 JonnyBoats 2/25/2010 #13

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

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

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

-编辑- 针对有关没有主密钥的评论:我同意这很糟糕,就像我认为允许用户以外的任何人访问用户帐户是不好的一样。如果你看一下这个问题,整个前提是客户强制要求一个高度受损的安全环境。

主密钥不必像最初看起来那么糟糕。我曾经在一家国防工厂工作,他们认为大型计算机操作员在某些情况下需要拥有“特殊访问权限”。他们只需将特殊密码放入密封的信封中,然后将其贴在操作员的办公桌上。要使用密码(操作员不知道),他必须打开信封。每次换班时,值班主管的一项工作就是查看信封是否已打开,如果是,请立即更改密码(由另一个部门更改),并将新密码放入新信封中,然后重新开始该过程。操作员将被问及他为什么要打开它,并将事件记录在案。

虽然这不是我会设计的程序,但它确实奏效并提供了出色的问责制。一切都被记录和审查,而且所有操作员都有国防部的秘密许可,我们从来没有发生过任何滥用行为。

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

所以我想真正的答案是,如果一个人想把事情做对,就要雇用他们可以信任的人,进行背景调查,并实行适当的管理监督和问责制。

但话又说回来,如果这个可怜的家伙的客户有良好的管理,他们一开始就不会要求这样一个安全解决方案,现在他们会吗?

评论

0赞 Carson Myers 2/28/2010
主密钥将非常危险,支持人员可以访问每个帐户 - 一旦您将该密钥提供给用户,他们就拥有主密钥并访问所有内容。
0赞 Phil Miller 2/28/2010
万能钥匙是一个可怕的主意,因为如果有人发现它(或意外地向他们透露),他们就可以利用它。因为每个帐户的密码重置机制要好得多。
0赞 JonnyBoats 3/2/2010
我很好奇,我以为 Linux 默认有一个具有根级访问权限的超级用户帐户?这不是访问系统上所有文件的“主密钥”吗?
0赞 Nicholas Shanks 5/28/2013
@JonnyBoats 是的。这就是为什么像 Mac OS X 这样的现代 Unix 禁用 root 帐户的原因。
0赞 Ben Voigt 11/21/2016
@NicholasShanks:禁用 root 帐户,还是禁用 root 帐户上的交互式登录?仍然有很多代码以无限权限运行。
1赞 Amir Arad 2/25/2010 #14

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

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

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

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

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

总而言之,你让黑客的工作更加困难。任何一台服务器上出现安全漏洞的可能性仍然相同,但有意义的数据(帐户和密码的匹配)将很难收集。

评论

3赞 molf 2/25/2010
如果应用服务器可以访问它,那么任何有权访问应用服务器的人(无论是黑客还是恶意内部人员)也可以访问它。这提供了零额外的安全性。
1赞 Amir Arad 2/25/2010
这里增加的安全性是应用程序服务器的数据库不保存密码(因此需要第二次黑客攻击 - 密码数据库),并且密码数据库可以更好地防止异常活动,因为您可以控制密码检索服务的可访问性。因此,您可以检测批量数据检索,每周更改检索 SSH 密钥,甚至不允许自动通过检索,并且全部手动完成。该解决方案还适用于密码数据库的任何其他内部加密方案(如公钥+私钥、盐等)。
54赞 Mr. Boy 2/25/2010 #15

看完这部分:

在下面的注释中,我指出了这一点 主要面向 老年人、智障人士或非常 年轻会让人感到困惑 当他们被要求执行 安全密码恢复例程。 虽然我们可能会发现它很简单和 在这些情况下,一些用户需要 任何一个拥有的额外帮助 服务技术人员帮助他们进入 系统或通过电子邮件发送/显示 直接给他们。

在这样的系统中,损耗率 从这些人口统计数据中可能会步履蹒跚 应用程序(如果用户不是) 鉴于这种级别的访问协助, 所以请回答这样的设置 介意。

我想知道这些要求中是否有任何一个要求需要可检索的密码系统。例如: 梅布尔阿姨打来电话说:“你的互联网程序不起作用,我不知道我的密码”。“好的,”客服无人机说,“让我检查一些细节,然后我会给你一个新密码。当您下次登录时,它会询问您是要保留该密码还是将其更改为您更容易记住的密码。

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

对于不太懂 PC 的人来说,这比被告知他们的旧密码更糟糕吗?虽然客户服务人员可以恶作剧,但数据库本身在被破坏时要安全得多。

评论我的建议有什么不好的地方,我会建议一个真正满足你最初想要的解决方案。

评论

4赞 Shane 2/26/2010
@john - 我认为这是一个完全可行的解决方案。不过,准备好对内部威胁大发雷霆!你知道,如果我使用中间密码重置来做到这一点(技术人员手动将密码设置为临时密码,并告诉 Mabel 键入 1234 作为她的密码),那么它可能在不包含重要数据的系统上运行良好。但是,如果这是一个高安全性的环境,那么我们就会遇到一个问题,即 cust 服务可以将 CEO 的密码设置为 1234 并直接登录。没有完美的解决方案,但这个解决方案在很多情况下都有效。(+1)
5赞 Aaronaught 3/1/2010
我刚刚注意到这个答案。@Shane,我不明白你为什么预测会因为“内部威胁”而大发雷霆。更改密码的能力并不是一个明显的弱点;问题在于能够发现可能用于其他服务的密码 - 她的电子邮件,她的银行,她的在线购物网站,这些网站存储了她的CC信息。这种弱点在这里没有表现出来;如果 Bob 重置了 Mabel 的密码并通过电话告诉她,则不会让他访问她的任何其他帐户。但是,我会强制而不是“建议”登录时重置密码。
0赞 Shane 3/1/2010
@Aaronaught - 我确实明白你的意思,但我想到的是,即使是客户服务人员也被锁定在系统的某些区域(例如工资单、会计等)之外,并且允许他们直接设置密码本身就是一个安全问题。不过,我确实明白你的意思,我问这个问题的系统类型与内部会计系统有很大不同。我们可能会对其中的专有内部系统和密码安全性进行完全不同的讨论。
1赞 Aaronaught 3/1/2010
@Shane:那么这个问题就更没有意义了。我假设您希望有人通过电话向他们读取密码。如果您想通过一些自动化的自助服务系统通过电子邮件向用户发送密码,那么您不妨完全放弃密码,因为它受到更弱的“保护”。也许你需要更具体地了解你试图支持什么样的可用性方案。也许该分析随后会向您表明,甚至不需要可恢复的密码。
4赞 kgilpin 9/19/2013
支持人员提供的代码实际上不一定是新密码。它可以只是一个一次性代码,用于解锁密码重置功能。
27赞 Jacob 2/28/2010 #16

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

  • 用户是否从通过电子邮件发送密码中受益?不。他们从一次性密码重置链接中获得更多好处,这有望使他们能够选择他们会记住的密码。
  • 用户是否受益于在屏幕上显示其密码?不,原因与上述相同;他们应该选择一个新密码。
  • 让支持人员向用户说出密码对用户是否有益?不;同样,如果支持人员认为用户对其密码的请求已正确通过身份验证,则获得新密码并有机会更改密码更有利于用户。此外,电话支持比自动密码重置更昂贵,因此该公司也没有受益。

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

阅读这些类型的请求的字里行间,您会发现您的客户可能根本不了解甚至根本不关心密码的管理方式。他们真正想要的是一个对用户来说不那么难的身份验证系统。因此,除了告诉他们他们实际上不想要可恢复的密码之外,您还应该为他们提供使身份验证过程不那么痛苦的方法,尤其是在您不需要银行等高安全级别的情况下:

  • 允许用户使用其电子邮件地址作为其用户名。我见过无数用户忘记用户名的情况,但很少有人忘记他们的电子邮件地址。
  • 提供 OpenID,让第三方支付用户健忘的成本。
  • 放宽密码限制。我敢肯定,当某些网站因为“您不能使用特殊字符”或“您的密码太长”或“您的密码必须以字母开头”等无用要求而不允许您的首选密码时,我们都会感到非常恼火。此外,如果易用性比密码强度更重要,您可以通过允许较短的密码或不需要混合字符类来放宽非愚蠢的要求。随着限制的放宽,用户将更有可能使用他们不会忘记的密码。
  • 不要让密码过期。
  • 允许用户重复使用旧密码。
  • 允许用户选择自己的密码重置问题。

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

  • 让用户选择数字引脚,最好不要是 4 位数字,最好仅在暴力破解尝试受到保护的情况下才选择。
  • 让用户选择一个只有他们知道答案的问题,永远不会改变,他们会永远记住,而且他们不介意其他人发现。
  • 让用户输入用户名,然后绘制一个易于记忆的形状,并具有足够的排列以防止猜测(请参阅这张漂亮的照片,了解 G1 如何解锁手机)。
  • 对于儿童网站,您可以根据用户名(有点像标识符)自动生成一个模糊的生物,并要求用户给该生物一个秘密名称。然后,系统会提示他们输入生物的秘密名称进行登录。

评论

0赞 AviD 3/1/2010
我在这里回应了这些评论,在我的回应中,因为它相当冗长——我认为审查对所提出问题的分析和讨论很重要。stackoverflow.com/questions/2283937/......
0赞 Dmitri Zaitsev 8/24/2013
用户是否受益于在屏幕上显示其密码?在我看来 - 绝对是的!每次我从互联网上获得晦涩难懂的密码时,我都感谢Apple,我可以让它可见,这样我就不必痛苦地重新输入100次。我可以想象残疾人的感受。
1赞 Jacob 8/25/2013
为什么显示一个晦涩难懂的密码比让您选择一个你能记住的新密码更好?
0赞 Alexander Shcheblikin 3/8/2014
@Jacob:熵更多?
9赞 Thomas #17

保护凭据不是二进制操作:安全/不安全。安全性是关于风险评估的,并且是连续衡量的。安全狂热者讨厌这样想,但丑陋的事实是,没有什么是完全安全的。具有严格密码要求的哈希密码、DNA 样本和视网膜扫描更安全,但会以开发和用户体验为代价。明文密码的安全性要低得多,但实施起来成本更低(但应避免使用)。归根结底,它归结为对违规行为的成本/收益分析。您可以根据所保护数据的值及其时间值来实现安全性。

某人的密码被泄露到野外的成本是多少?在给定系统中模拟的成本是多少?对于联邦调查局的计算机来说,成本可能是巨大的。对于 Bob 的一次性五页网站来说,成本可以忽略不计。专业人员为他们的客户提供选择,并在安全性方面列出任何实施的优势和风险。如果客户要求由于不遵守行业标准而可能使他们面临风险的东西,则情况会加倍。如果客户特别要求双向加密,我会确保你记录你的反对意见,但这不应该阻止你以你所知道的最佳方式实施。归根结底,这是客户的钱。是的,你应该推动使用单向哈希,但说这绝对是唯一的选择,其他任何事情都是不道德的,这完全是无稽之谈。

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

据我所知,没有任何法律(英国的《数据保护法》)明确规定密码必须使用单向哈希进行存储。这些法律中的任何一项的唯一要求只是采取合理的安全措施。如果对数据库的访问受到限制,即使是纯文本密码也可以合法地受到这种限制。

然而,这确实揭示了另一个方面:法律优先权。如果法律优先权表明,鉴于构建系统的行业,您必须使用单向哈希,那么情况就完全不同了。这就是你用来说服客户的弹药。除此之外,最好的建议是提供合理的风险评估,记录您的反对意见,并根据客户的要求以最安全的方式实施系统。

评论

10赞 Aaronaught 3/1/2010
您的答案完全忽略了密码在多个站点/服务中重复使用,这是本主题的核心,也是可恢复密码被视为严重弱点的原因。安全专业人员不会将安全决策委托给非技术客户;专业人士知道他的责任超出了付费客户的范围,并且不提供高风险和回报的选择。-1 对于重言辞而轻描淡写的咆哮 - 甚至没有真正回答问题。
4赞 Thomas 3/1/2010
同样,您完全忽略了风险评估。要使用您的论点,您不能只停留在单向哈希值上。您还必须包括复杂性要求、密码长度、密码重用限制等。如果系统无关紧要,那么认为用户将使用哑密码或重复使用密码并不是充分的商业理由,坦率地说,我确实回答了这个问题。简短的回答:推动使用 std 实现,如果您被否决,请记录您的反对意见并继续前进。
7赞 Aaronaught 3/1/2010
你再一次重复谣言,这些对于低价值系统来说都无关紧要!用户密码的值与系统上用户帐户的值无关。这是一个秘密,你必须永远保守。我希望我能再给一个 -1 的评论,表明你仍然不理解这里的问题。
5赞 Thomas 3/1/2010
风险评估是核心问题。密码重用只是一组更大的问题中的一个潜在问题。为什么不需要遥控钥匙?为什么不要求此人开车到您的办公室登录?如果没有对风险的合理评估,就无法回答这些问题。在你的世界里,一切都是风险,所以每个系统都需要FBI级别的登录安全性。这根本不是现实世界的运作方式。
7赞 Aaronaught 3/1/2010
这里唯一清楚的是,你的整个论点只不过是一个滑坡谬误,你试图用“风险评估”这样的流行语来掩盖这一事实。请放心,“FBI”使用的任何系统都将比 bcrypt 哈希和最小密码长度安全得多。如果要求行业标准的身份验证系统使我成为“安全狂热者”,那么我想我是一个狂热者;就我个人而言,知道有人愿意为了金钱而牺牲我的安全,我感到很痛苦。这是不道德的
1036赞 Michael Burr 2/28/2010 #18

在这个问题上采取另一种方法或角度怎么样?询问为什么密码必须是明文的:如果这样用户可以检索密码,那么严格来说,您实际上不需要检索他们设置的密码(反正他们不记得密码是什么),您需要能够给他们一个可以使用的密码。

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

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

  • 一个熵约为 77 位的密码:“承认散文耀斑表敏锐的天赋”

  • 熵约为 74 位的密码:“K:&$R^tt~qkD”

我知道我更喜欢输入短语,并且使用复制粘贴,该短语的易用性也不亚于密码,因此不会丢失。当然,如果您的网站(或任何受保护的资产)不需要 77 位熵来自动生成的密码短语,请生成更少的单词(我相信您的用户会喜欢)。

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

评论

93赞 Aaronaught 3/1/2010
+1 用于密码短语,目前似乎在密码强度和用户召回之间提供了最佳平衡。
197赞 Dominik Weber 8/26/2010
您也可以做一个完整的句子,例如<形容词> <名词>是<动词> <副词>。绿猫疯狂地跳跃。有类别列表。每个选项有 1024 个选项,您有 40 位熵。
28赞 lurscher 10/13/2010
+1 将密码重用视为避免密码重用的关键问题
57赞 joachim 12/11/2010
“想想看 - 如果用户需要找回密码,那是因为他们忘记了密码” - 不一定是真的!我经常想得到我的密码,因为我在笔记本电脑上,我知道我家里的机器存储了我的密码,或者它被写在安全的地方,我不想通过获得新密码来破坏它。
5赞 Pops 11/16/2011
新的 IT Security SE 网站上得分最高的问题涉及此熵计算的有效性。(嗯,从技术上讲,它处理的是@Pieter链接的 xkcd。
3赞 mrankin 10/13/2010 #19

如果您不能拒绝存储可恢复密码的要求,那么将其作为您的反驳论点怎么样?

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

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

评论

0赞 Aaronaught 10/14/2010
只要您有一个与密码关联的电子邮件地址,并且该密码是可恢复的,您就可能由于重复使用密码而泄露了该电子邮件地址的密码。这实际上是这里的主要关注点。实际上,没有其他重要的个人身份信息。
1赞 mrankin 10/14/2010
你完全错过了我的观点。如果您真的不需要密码,请不要收集密码。开发人员经常陷入“这就是我们做事的方式”的思维模式。有时,抛弃先入为主的观念会有所帮助。
7赞 Monoman 10/13/2010 #20

我以实施多因素身份验证系统为生,因此对我来说,很自然地认为您可以重置或重建密码,同时暂时使用更少的因素来验证用户,以便仅进行重置/重新创建工作流。特别是,使用OTP(一次性密码)作为一些附加因素,如果建议的工作流程的时间窗口很短,则可以降低大部分风险。我们已经为智能手机实施了软件OTP生成器(大多数用户已经随身携带了一整天),并取得了巨大的成功。在出现对商业插件的抱怨之前,我要说的是,当密码不是用于验证用户的唯一因素时,我们可以降低保持密码易于检索或重置的固有风险。我承认,对于站点之间的密码重用场景,情况仍然不妙,因为用户会坚持使用原始密码,因为他/她也想打开其他站点,但您可以尝试以最安全的方式提供重建的密码(htpps 和 html 上的谨慎外观)。

评论

0赞 Aaronaught 10/14/2010
与许多网站上令人愤怒的“秘密问题”系统相比,从多因素身份验证系统中暂时删除一个因素确实是一种更安全的重置密码的方法。但是至于以可恢复的格式存储密码,我不确定它有什么帮助,除非您以某种方式使用第二个因素来加密或混淆第一个因素,而且我不确定这如何可能像 SecurID 这样的东西。你能解释一下吗?
0赞 Monoman 10/19/2010
@Aaronaught 我说的是,如果您“需要”拥有可恢复的密码,那么如果它不是唯一的身份验证因素,则固有风险会降低,并且如果该工作流重用他/她已经拥有并具有当前访问权限的因素,那么对于最终用户来说也更容易,而不是试图记住可能也被遗忘的“秘密答案”或使用限时链接或临时密码, 两者都通过不安全的通道发送(除非您使用带有客户端证书的 S-MIME 或 PGP,两者都会产生成本,特别是在管理正确关联和过期/替换方面)
1赞 Aaronaught 10/19/2010
我想这一切都是真的,但一开始公开妥协的风险是最小的;可恢复密码更严重的问题是内部安全,并可能允许心怀不满的员工使用数千名客户的电子邮件密码离开,或者不正当的首席执行官将其出售给网络钓鱼者和垃圾邮件发送者。双因素身份验证在打击身份盗用和密码猜测方面非常出色,但在保持实际密码数据库安全方面并没有真正带来太多好处。
11赞 Daniel Loureiro 4/28/2013 #21

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

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

  • 加密方式:openssl_encrypt(string $data , string $method , string $password)
  • 数据参数
    • 敏感信息(例如用户密码)
    • 必要时进行序列化,例如,如果信息是多个敏感信息等数据数组
  • 密码参数:使用只有用户知道的信息,例如:
    • 用户车牌
    • 社会安全号码
    • 用户电话号码
    • 用户母名称
    • 注册时通过电子邮件和/或短信发送的随机字符串
  • 方法参数
    • 选择一种密码方法,例如“AES-256-CBC”
  • 切勿将“password”参数中使用的信息存储在数据库(或系统中的任何地方)

当有必要检索这些数据时,只需使用“openssl_decrypt()”函数并向用户询问答案。例如:“要接收您的密码,请回答以下问题:您的手机号码是什么?

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

PS 2:对于信用卡信息,例如“一键购买”,我所做的就是使用登录密码。此密码在数据库(sha1、md5 等)中进行哈希处理,但在登录时,我将纯文本密码存储在会话中或非持久性(即在内存中)安全 cookie 中。这个普通密码永远不会留在数据库中,事实上它总是留在内存中,在部分末尾被销毁。当用户点击“一键购买”按钮时,系统将使用此密码。如果用户使用 facebook、twitter 等服务登录,那么我会在购买时再次提示密码(好吧,这不是完全“点击”),或者然后使用用户用于登录的服务的一些数据(如 facebook id)。

13赞 Nicholas Shanks 5/28/2013 #22

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

因此,步骤将是:

  1. 用户在您的网站上注册(当然是通过SSL),但尚未设置密码。自动登录或提供临时密码。
  2. 您提出存储其公共 PGP 密钥以供将来检索密码。
  3. 他们上传其公共 PGP 密钥。
  4. 您要求他们设置新密码。
  5. 他们提交密码。
  6. 您可以使用可用的最佳密码哈希算法(例如 bcrypt)对密码进行哈希处理。在验证下次登录时使用此选项。
  7. 您可以使用公钥加密密码,并将其单独存储。

如果用户随后要求输入密码,则使用加密(未哈希处理)密码进行响应。如果用户不希望将来能够检索其密码(他们只能将其重置为服务生成的密码),则可以跳过步骤 3 和 7。

评论

5赞 Robert Harvey 7/22/2013
大多数用户没有 PGP 密钥(我仍然没有;在这个行业工作了 20 年后,我从未觉得有必要),而且获得一个密钥并不是一个顺畅的过程。此外,无论如何,私钥实际上只是实际密码的代理。换句话说,它是密码的密码;一路往下都是。
1赞 Nicholas Shanks 7/22/2013
@RobertHarvey 目标是允许用户检索他们的密码,而不允许网站员工或任何黑客获取它。通过要求在用户自己的计算机上进行检索过程,可以强制执行此操作。很可能有PGP的替代品可以实现同样的目标。一路走来可能是海龟(也许是沿途的一些大象),但我没有看到任何其他方式。对于普通人群(不太可能成为单独的目标)来说,将您的密码放在纸上,并且无法从服务中检索它们,将比我们目前更安全
0赞 Lodewijk 8/5/2014
我喜欢它,因为它迫使每个人都拥有 PGP 公钥,奇怪的是,这是一件非常合乎道德的事情。
0赞 My1 2/17/2016
你可以只生成一个并将其提供给用户。
0赞 Kjartan 11/23/2016
@RobertHarvey 您可能是对的,这“不是一个无摩擦的过程”,但它可能是高级用户的一项额外服务,普通用户可以忽略它。至于关于PK是“密码的密码”的论点,请记住,理论上许多密码都可以如此;您可以对不同的服务使用不同的密码,并使用相同的密钥对它们进行加密。那么PK将比单个密码更有价值。也许它以抽象的方式与密码管理器(?不过,我目前还不清楚这可能产生什么后果......
5赞 Dmitri Zaitsev 8/24/2013 #23

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

  • 问题1.用户坚持访问纯文本存储密码的实际原因是什么?为什么它有如此大的价值?

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

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

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

我看到的另一个问题问:

  • 问题2.如果用户一开始就不记得密码,为什么旧密码很重要?

这是可能的答案。 如果你有一只叫“miaumiau”的猫,并使用她的名字作为密码,但忘记了你,你更愿意被提醒它是什么,还是更确切地说,被发送类似“#zy*RW(ew”)的东西?

另一个可能的原因是用户认为想出一个新密码是一项艰巨的工作!因此,将旧密码寄回会给人一种错觉,可以再次将她从痛苦的工作中解救出来。

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

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

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

我知道这是不安全的,但我在乎有人访问我的“帐户”吗?是的,他也可以阅读新闻!

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

这只是为了展示用户对问题的态度。

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

2赞 Jeremy C 7/23/2015 #24

根据我对这个主题的了解,我相信如果你正在建立一个带有登录/密码的网站,那么你甚至不应该在你的服务器上看到明文密码。在密码离开客户端之前,应该对密码进行哈希处理,并且可能对其进行加盐处理。

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

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

1赞 Sablefoste 12/2/2015 #25

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

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

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

此解决方案的一个转折点是将操作请求发送给第三方受信任的管理员。这在老年人、智障人士、非常年轻或有其他困惑的用户的情况下效果最好。当然,这需要一个受信任的管理员来支持这些人的行动。

1赞 Eliott 5/5/2017 #26

像往常一样对用户的密码进行加盐和哈希处理。登录用户时,既要允许用户的密码(加盐/散列后),也要允许用户实际输入的内容匹配。

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

基本上,使加盐/散列的密码也成为“纯文本”密码。

评论

0赞 Artjom B. 5/11/2017
为什么您认为有必要将用户直接输入的内容与存储在数据库中的哈希密码进行比较?这能为您提供什么样的功能?此外,在执行此操作时,在用户输入的密码和数据库中的哈希密码之间应用恒定时间比较功能非常重要。否则,几乎可以根据时间差异确定哈希密码。
1赞 Eliott 5/11/2017
@ArtjomB。该问题询问如何保护用户的密码,同时允许客户支持 (CS) 通过输入用户忘记的密码来与用户交谈/发送电子邮件。通过使哈希版本可用作纯文本密码,CS 可以读出它并让用户使用它来代替他们忘记的密码。CS 还可以使用它以用户身份登录并帮助他们完成任务。这也允许那些熟悉自动忘记密码系统的用户受到保护,因为他们输入和使用的密码是经过哈希处理的。
0赞 Artjom B. 5/12/2017
明白了。我还没有完整地阅读这个问题。使用恒定时间比较仍然是必要的,以防止整个系统的微不足道的损坏。