1343

随着我继续构建越来越多的网站和 Web 应用程序,我经常被要求以一种在用户遇到问题时可以检索到的方式存储用户的密码(或者通过电子邮件发送忘记的密码链接,通过电话等)我什么时候可以激烈地反对这种做法,我会做很多“额外的”编程来使密码重置和管理协助成为可能,而无需存储他们的实际密码。

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

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

在道德和伦理上,我觉得有责任保护一些用户的生计,即使他们对待它的尊重要少得多。我确信有很多方法可以解决哈希哈希和不同的编码选项,但是当你必须存储它们时是否有一个单一的“最佳实践”?在几乎所有情况下,如果这对我处理细节的方式有任何影响,我都会使用 PHP 和 MySQL。

赏金的附加信息

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

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

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

谢谢大家

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

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

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

4

26 回答 26

1037

在这个问题上采取另一种方法或角度怎么样?问为什么要求密码是明文的:如果是为了让用户可以找回密码,那么严格来说你并不需要找回他们设置的密码(反正他们不记得是什么了),你需要能够给他们一个他们可以使用的密码。

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

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

  • 一个大约 77 位熵的密码:“承认散文耀斑表急性天赋”

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

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

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

于 2010-02-28T08:16:51.197 回答
592

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

建筑师: 对于这种规模和容量的建筑,你需要在这里、这里和这里有消防通道。
客户: 不,维护起来太复杂和昂贵,我不想要任何侧门或后门。
建筑师: 先生,消防通道不是可选的,根据城市的消防法规,它们是必需的。
客户: 我不会付钱让你争论。照我说的做。

那么建筑师是否会问如何在没有消防出口的情况下合乎道德地建造这座建筑?

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

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

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

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

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

于 2010-02-18T16:05:01.127 回答
206

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

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

  • 密码以加密方式存储
  • 人们无需解密为明文即可登录
  • 密码可以恢复为纯文本,但只能使用可以存储在系统外部的私钥(如果您愿意,可以存储在银行保险箱中)。
于 2010-02-17T20:07:39.800 回答
133

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

于 2010-02-18T09:59:17.763 回答
94

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

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

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

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

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

于 2010-02-23T15:20:55.807 回答
55

读完这部分:

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

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

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

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

对于那些不太懂电脑的人来说,这比被告知他们的旧密码更糟糕吗?虽然客户服务人员可以恶作剧,但数据库本身更安全,以防万一它被破坏。

评论我的建议有什么不好,我会建议一个实际上可以满足您最初想要的解决方案。

于 2010-02-25T11:27:20.507 回答
42

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

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

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

于 2010-02-18T13:56:46.967 回答
27

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

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

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

仔细阅读这些类型的请求,您会发现您的客户可能根本不了解或实际上根本不关心密码的管理方式。他们真正想要的是一个对他们的用户来说并不难的身份验证系统。因此,除了告诉他们他们实际上不想要可恢复的密码之外,您还应该为他们提供一些方法来减少身份验证过程的痛苦,特别是如果您不需要银行的高安全级别:

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

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

  • 让用户选择一个数字密码,最好不是 4 位数字,并且最好只有在暴力尝试受到保护的情况下。
  • 让用户选择一个只有他们知道答案、永远不会改变、他们会永远记住并且他们不介意其他人发现的简短答案的问题。
  • 让用户输入用户名,然后绘制一个易于记忆的形状,并具有足够的排列以防止猜测(请参阅这张G1 如何解锁手机的精美照片)。
  • 对于儿童网站,您可以根据用户名(有点像一个身份图标)自动生成一个模糊的生物,并要求用户给该生物一个秘密名称。然后可以提示他们输入生物的秘密名称以登录。
于 2010-02-27T20:10:57.357 回答
25

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

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

因此,我建议另一种解决方案:
取决于系统的价值,并且当系统具有适当的低价值且没有“昂贵”资产(包括身份本身),并且有有效的业务需求来制定正确的流程不可能(或足够困难/昂贵),并且客户知道所有警告......
然后简单地允许可逆加密可能是合适的,没有特殊的箍跳过。
我没有说根本不用加密,因为它实现起来非常简单/便宜(即使考虑到可通过的密钥管理),而且它确实提供了一些保护(超过了实现它的成本)。此外,如何通过电子邮件、在屏幕上显示等方式向用户提供原始密码也值得研究。
由于这里假设被盗密码的价值(即使是总和)非常低,因此任何这些解决方案可能是有效的。


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

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

但是,问题的症结在于原则是否有任何情况可能没有必要禁止这样做,如果是,如何以适合该情况的最正确方式进行

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

你知道,这很有趣——我一直认为自己是安全狂热者之一,不知何故,我站在那些所谓的“安全专家”的对立面……嗯,事实是——因为我是一个狂热者,和一个真正的现实生活中的安全专家——我不相信在没有最重要的风险分析的情况下宣扬“最佳实践”教条(或 CWE)。
“当心安全狂热者,他们会快速应用工具带中的所有内容,却不知道他们要防御的实际问题是什么。更高的安全性并不一定等同于良好的安全性。”
风险分析和真正的安全狂热者将基于风险、潜在损失、可能的威胁、补充缓解等,指向更明智的、基于价值/风险的权衡。任何不能将健全的风险分析作为“安全专家”他们的建议的基础,或支持逻辑权衡,但宁愿在甚至不了解如何执行风险分析的情况下说出教条和 CWE,这些都是安全黑客,他们的专业知识不值得他们打印出来的卫生纸。

事实上,这就是我们得到机场安全这一荒谬的方式。

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

反正。
那么,如果我们对密码进行对称加密,而不是使用单向哈希,那么我们这里的主要风险是什么?

  • 冒充用户?不,我已经接受了这个风险,不感兴趣。
  • 邪恶的管理员?好吧,也许……但是,我不在乎是否有人可以冒充其他用户,无论是否有内部用户……无论如何,恶意管理员无论如何都会获取您的密码-如果您的管理员变坏了,无论如何它都结束了。
  • 另一个问题是,身份实际上是在多个系统之间共享的。啊! 这是一个非常有趣的风险,需要仔细观察。
    让我首先断言共享的不是实际身份,而是证明或身份验证凭证。好的,因为共享密码将有效地允许我进入另一个系统(例如,我的银行帐户或 gmail),这实际上是相同的身份,所以它只是语义......除了它不是。在这种情况下,身份由每个系统单独管理(尽管可能存在第三方 id 系统,例如 OAuth - 尽管如此,它与该系统中的身份是分开的 - 稍后会详细介绍)。
    因此,这里的核心风险点是用户愿意将他的(相同的)密码输入到几个不同的系统中——现在,我(管理员)或我网站的任何其他黑客都可以访问 Erma 姨妈的密码核导弹基地。

嗯。

你觉得这里有什么不对劲吗?

它应该。

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

是的,用户教育总是会回来咬我们,不是吗?
而且您对此无能为力...即使您要在您的网站上散列他们的密码,并做 TSA 可以想到的所有其他事情,您也可以为他们的密码添加保护,而不是 ONE WHIT,如果他们要保留的话将密码混杂地粘贴到他们遇到的每个站点中。甚至不用费心去尝试。

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

所以,我亲爱的安全专家,就像一位老妇人曾经问温迪的那样,“风险在哪里?”

另外几点,针对上面提出的一些问题:

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

唷。多么长的帖子......
但要回答你原来的问题,@Shane:

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

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

于 2010-02-23T15:01:47.897 回答
21

半途而废怎么样?

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

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

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

于 2010-02-17T20:01:32.173 回答
13

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

所以步骤是:

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

如果用户随后询问他们的密码,您将使用加密(非散列)密码进行响应。如果用户不希望将来能够检索他们的密码(他们只能将其重置为服务生成的密码),则可以跳过第 3 步和第 7 步。

于 2013-05-28T09:03:53.090 回答
12

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

于 2010-02-17T20:53:17.563 回答
11

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

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

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

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

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

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

于 2013-04-27T22:24:27.267 回答
9

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

某人的密码泄露出去的成本是多少?在给定系统中模拟的成本是多少?对于 FBI 计算机而言,成本可能是巨大的。对于 Bob 的一次性五页网站,成本可以忽略不计。专业人士为他们的客户提供选项,并在安全性方面列出任何实施的优势和风险。如果客户要求的东西可能会因为未能遵守行业标准而使他们处于危险之中,那么情况就更是如此了。如果客户特别要求双向加密,我会确保您记录您的反对意见,但这不应阻止您以您知道的最佳方式实施。归根结底,这是客户的钱。是的,

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

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

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

于 2010-02-27T20:38:00.330 回答
8

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

于 2010-02-18T13:35:06.790 回答
7

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

于 2010-10-13T15:09:11.360 回答
5

抱歉,只要你有办法破译他们的密码,就不可能安全。苦战,如果你输了,CYA。

于 2010-02-17T20:48:56.970 回答
5

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

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

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

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

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

我看到的另一个问题是:

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

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

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

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

作为用户,我想要简单的事情!我不想努力!

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

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

该网站是否存储我的“私人”信息?我今天看到的新闻?那是网站的问题,不是我的!该站点是否向经过身份验证的用户显示私人信息?那就不要一开始就表现出来!

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

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

于 2013-08-24T11:52:11.923 回答
4

处理丢失/忘记的密码:

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

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

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

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

于 2010-02-18T14:01:14.170 回答
3

如何在注册时通过电子邮件发送明文密码,然后再将其加密和丢失?我已经看到很多网站都这样做了,从用户的电子邮件中获取该密码比将其留在您的服务器/计算机上更安全。

于 2010-02-24T12:32:37.943 回答
3

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

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

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

于 2010-10-13T14:30:17.983 回答
2

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

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

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

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

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

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

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

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

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

于 2010-02-24T23:11:11.663 回答
2

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

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

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

于 2015-07-23T14:16:45.320 回答
1

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

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

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

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

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

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

于 2010-02-24T23:50:16.670 回答
1

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

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

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

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

于 2015-12-02T07:35:16.883 回答
1

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

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

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

于 2017-05-04T18:19:38.987 回答