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

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

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

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

赏金的附加信息

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

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

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

谢谢大家

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

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

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

有帮助吗?

解决方案

采取另一种方法或角度来解决这个问题怎么样?问为什么密码要求是明文:如果是为了让用户可以检索密码,那么严格来说,您实际上并不需要检索他们设置的密码(他们无论如何都不记得它是什么),您需要能够给他们一个密码 可以使用.

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

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

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

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

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

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

其他提示

想象一下,有人委托建造一座大型建筑 - 比如说一家酒吧 - 并且发生以下对话:

建筑师: 对于这种规模和容量的建筑,这里、这里和这里都需要消防出口。
客户: 不,维护起来太复杂和昂贵,我不想要任何侧门或后门。
建筑师: 先生,消防出口不是可选的,而是根据城市消防法规所必需的。
客户: 我付钱不是为了让你争论。就按我要求的去做吧。

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

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

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

计算机编程可能不是 领有牌照 职业,但人们似乎常常想知道为什么我们的职业没有得到与土木或机械工程师相同的尊重 - 好吧,别再犹豫了。这些职业在收到垃圾(或完全危险的)要求时,会简单地拒绝。他们知道这不是借口说:“好吧,我尽了最大的努力,但他坚持认为,我必须做他说的事情。”他们可能会为此借口失去许可证。

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

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

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

我认为这实际上有点类似于 Windows 恢复代理 作品。

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

不要放弃。你可以用它来说服你的客户武器是不可否认性。如果您可以通过任何机制重建用户密码,你给的及其的客户提供法律不可抵赖性机制,他们可以否认这取决于密码的任何交易,因为没有办法供应商可以证明他们没有重建口令,并通过自己把交易。如果密码正确的消化,而不是密文存储,这是不可能的,无论是ERGO最终客户执行交易自己或违反他的关心w.r.t.的责任密码。在与他正视叶责任这两种情况下。我在的情况下,将达到数亿美元的工作。你想错了不是。

您不能合乎道德地存储密码以供以后进行明文检索。就这么简单。即使乔恩·斯基特(Jon Skeet)也无法合乎道德地存储密码以供以后进行明文检索。如果您的用户可以以某种方式检索纯文本密码,那么在您的代码中发现安全漏洞的黑客也可能如此。这不仅仅是一个用户的密码被泄露,而是 他们全部。

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

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

以下是我就该主题撰写的几篇博客文章:

更新: 我们现在开始看到针对未能妥善保护用户密码的公司的诉讼和起诉。例子: LinkedIn 面临 500 万美元集体诉讼; 索尼因 PlayStation 数据黑客攻击被罚款 25 万英镑. 。如果我没记错的话,LinkedIn 实际上正在对其用户的密码进行加密,但它使用的加密技术太弱,无法发挥作用。

在阅读本部分后:

  

在一个音符下我提出的点   网站主要是面向朝   老人,智障,或非常   年轻人可以成为人们混淆   当他们被要求执行   安全密码恢复程序。   虽然我们可能会发现它简单,   平常在这些情况下,一些用户需要   既可以采用具有的额外援助   服务高科技帮助他们进入   系统或具有它通过电子邮件发送/显示   直接给他们。

     

在这样的系统中的损耗率   从这些人口可能会阻碍   如果用户不申请   鉴于此级别的访问权限援助,   所以请在这样一个设置回答   心。

我在想,如果任何的这些要求强制可回收密码系统。例如: 梅布尔阿姨打电话说:“你的互联网程序不工作,我不知道我的密码”。 “OK”表示,客户服务无人驾驶飞机“让我查了一些细节,然后我会给你一个新的密码即可。当你下次登录它会问你,如果你想保住你的密码或改变它的东西,你可以更容易记住。“

然后将系统设置为知道密码重置已经发生并显示“您想保留新密码,或者选择一个新的”消息。

这是怎么坏的少PC素养不是被告知他们的旧密码?虽然客户服务人员可以得到做鬼,数据库本身是在情况下,它违反安全得多。

评论什么是对我的建议不错,我会提出一个解决方案,实际上做了什么你最初想。

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

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

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

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

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

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

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

  • 允许用户使用其电子邮件地址作为用户名。我见过无数用户忘记用户名的案例,但很少有人忘记他们的电子邮件地址。
  • 提供 OpenID,让第三方支付用户遗忘的成本。
  • 放宽密码限制。我敢肯定,当某些网站不允许您的首选密码时,我们都会感到非常烦恼带一封信。”另外,如果易用性比密码强度更大,那么您也可以通过允许较短的密码或不需要字符类的混合来放松非stupid要求。随着限制的放松,用户将更有可能使用他们不会忘记的密码。
  • 不要让密码过期。
  • 允许用户重复使用旧密码。
  • 允许用户选择自己的密码重置问题。

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

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

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

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

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


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

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

然而问题的关键在于 原则, 有没有什么情况是不需要的 禁止这样做,如果是的话,如何在 适合情况的最正确方式.

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

你知道,这很有趣 - 我一直认为自己是安全狂热分子之一,但不知何故,我站在那些所谓的“安全专家”的对立面......好吧,事实是 - 因为我是一个狂热分子,也是一个真正的现实安全专家 - 我不相信在没有这一点的情况下大肆宣扬“最佳实践”教条(或 CWE) 风险分析.
“当心那些安全狂热分子,他们很快就应用了工具带中的所有内容,而不知道他们要防御的实际问题是什么。更多的安全性并不一定等于良好的安全性。”
风险分析和真正的安全狂热分子会根据风险、潜在损失、可能的威胁、补充缓解措施等,提出更明智的、基于价值/风险的权衡。任何“安全专家”如果不能指出合理的风险分析作为其建议的基础,或支持逻辑权衡,而是宁愿在不了解如何进行风险分析的情况下大肆宣扬教条和 CWE,那么他们只不过是安全黑客,并且他们的专业知识抵不上他们打印的卫生纸。

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

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

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

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

嗯。

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

它应该。

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

是的,用户教育确实总是会反过来伤害我们,不是吗?
而你对此无能为力......即使您要在您的网站上对他们的密码进行哈希处理,并执行 TSA 能想到的所有其他操作,您也为他们的密码添加了保护 一丁点儿都没有, ,如果他们继续将密码混杂地粘贴到他们访问的每个网站上。甚至不用费心去尝试。

换一种方式, 您不拥有他们的密码, ,所以不要再像你一样行事了。

所以,亲爱的安全专家们,正如一位老太太过去常问温迪的那样,“风险在哪里?”

针对上面提出的一些问题,再补充几点:

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

呼。好长的帖子啊...
但要回答你原来的问题,@Shane:

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

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

如何中途之家?

具有较强的加密来存储密码,并且不使能复位。

除了复位密码,允许发送一次性密码(即必须被尽快首次登录发生改变)。让用户然后换任何他们想要的密码(前一个,如果他们选择)。

您可以“卖”这个作为重置密码的安全机制。

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

所以步骤是:

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

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

我觉得你应该问自己真正的问题是:“我怎样才能在说服人们更好”

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

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

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

当需要检索此数据时,只需使用“openssl_decrypt()”函数并询问用户答案。例如。: “要接收密码,请回答以下问题:你的电话号码是?”

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

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

保护凭证不是二进制操作:安全/不安全的。安全是所有关于风险评估,并在连续测量。安全爱好者讨厌有这样的想法,但丑陋的真相是,没有什么是完全安全的。严格的密码要求,DNA样本,视网膜扫描散列密码更安全,但在开发和用户体验的成本。明文口令远远不够安全,但更便宜的实施(但应避免)。在这一天结束时,把它归结为违反的成本/效益分析。您根据被固定的数据的值和其时间值实现的安全性。

什么是别人的密码失控到野外的成本是多少?什么是模拟在给定系统的成本?联邦调查局电脑,成本可能是巨大的。鲍勃一次性五页的网站,成本可以忽略不计。一个专业的提供的选项给他们的客户,当涉及到安全,勾画出的优势和任何实现的风险。这是极为因此,如果客户端请求的东西,会令他们在因未听从行业标准的风险。如果客户特别要求双向加密,我会确保你记录你的反对,但是这不应该在你所知道的最好的方式实现阻止你。在一天结束的时候,这是客户的钱。是的,你应该推动使用单向散列但要说绝对是唯一的选择,和其他任何不道德完全是胡说八道。

如果你存储的密码与双向加密,安全说来说去密钥管理。 Windows提供的机制来限制访问私钥来管理帐户和密码与证书。如果您在其他平台的主机,你需要看你有没有可在这些的选项。正如其他人的建议,你可以使用非对称加密。

有没有法律(无论是数据保护法在英国),其中我知道,美专口令必须使用单向散列存储。在任何此类法律,唯一的要求很简单,就是 合理采取安全步骤。如果对数据库的访问限制,甚至明文密码可以这样的限制下,合法资格。

但是,这不会带来的光的一个以上方面:法律优先。如果法律优先表明您必须使用单向散列给出了其中系统正在建造的行业,那是完全不同的。这是你用来说服你的客户的弹药。除非是,最好的建议提供合理的风险评估,记录您的反对,并在你可以给出客户的需求最安全的方式实现系统。

请回答用户的安全问题的加密密钥的一部分,并没有存储安全问题答案为纯文本(哈希值代替)

我实现多因素身份验证系统为生,所以对我来说是很自然的认为你可以重置或重建口令,而暂时使用一个较小的因素,为刚刚复位/娱乐工作流程中的用户进行身份验证。尤其是使用的OTP(一次性口令),因为一些额外的因素,减轻多的风险,如果在时间窗口短于所建议的工作流程。我们已经实现了软件OTP发电机,智能手机(大多数用户已经与自己进行全天)大获成功。之前抱怨一个商业插件的出现,我的意思是,我们可以降低固有保持密码易于检索或重置的风险时,他们不习惯的用户进行身份验证的唯一因素。我承认,对站点场景中的密码重用的形势依然不漂亮,因为用户会坚持,因为他/她想要开拓其他网站也有原来的密码,但你可以尝试在提供重建密码最安全的方法(和HTPPS的HTML谨慎外观)。

很抱歉,但只要你有办法来解码自己的密码,有没有办法,这将是安全的。豁出去了苦涩,如果你输了,CYA。

刚刚遇到这个有趣且激烈的讨论。但最让我惊讶的是,人们对以下基本问题的关注是如此之少:

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

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

为什么这很重要?因为如果客户请求的真正原因是系统非常难以使用,那么也许解决确切的原因就能解决实际问题?

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

我看到的另一个问题是:

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

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

另一个可能的原因是用户认为想出新密码很困难!因此,将旧密码发回给她一种又把她从痛苦的工作中拯救出来的错觉。

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

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

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

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

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

这只是为了表明用户对问题的态度。

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

处理丢失/忘记密码:

没有人应该永远能够恢复口令。

如果用户忘记了自己的密码,他们必须至少知道其用户名或电子邮件地址。 根据要求,在生成用户表一个GUID并将其发送包含有包含GUID作为参数传递给用户的电子邮件地址的链接的电子邮件。

的链接背后的页验证参数GUID确实存在(可能与某些超时逻辑),并且请求一个新的用户输入密码。

如果你需要有热线电话,帮助用户,某些角色添加到您的授权模式,并允许热线的作用暂时登录为识别的用户。记录所有这样的热线登录。例如,Bugzilla的提供了这样一个模拟功能,以管理员。

约电子邮件注册时明文口令,得到它加密并丢失之前什么?我见过很多网站做到这一点,并获得来自用户的电子邮件密码,即比周围留在你的服务器/ COMP更安全。

如果你不能拒绝的要求来存储密码收回,这个怎么样为你的反驳。

我们既可以适当的散列密码,并建立一个复位机构对于用户来说,我们也可以从系统中删除所有个人身份信息。您可以使用一个电子邮件地址来设置用户偏好,但仅此而已。使用cookie来自动拉未来的访问偏好和合理时间后扔掉的数据了。

这通常与密码策略忽略了一个选项是否真的连需要密码。如果您的密码策略做的唯一的事情是原因的客服电话,也许你可以摆脱它。

执行用户的真正的需要恢复(例如被告知)他们忘记密码了,还是他们只是需要能够获得到系统?如果他们真正想要的是登录密码,为什么不能有一个例行程序,只是改变旧密码(不管它是什么)为新密码,该支持人员可以给失去他的密码的人?

我与做的正是这个系统的工作。该支持人员无法知道当前的密码是什么方式,但可以将其恢复到一个新的价值。当然,所有这些重置应该记录的地方和良好做法将产生电子邮件给用户告诉他的密码已重置。

另一种可能性是具有两个同时的密码允许访问的帐户。一个是用户管理“正常”的口令,另一个就是这样仅由支持人员已知的,并且同样为所有用户的骨架/主密钥。当用户有一个问题,支持人员可以登录到主密钥的帐户,并帮助用户更改密码,以任何的方式。不用说,用万能钥匙所有登录会由系统记录为好。作为一个额外的措施,每当主密钥用于你可以验证支持者凭证以及

CNC中在回答关于没有主密钥的意见:我认为,这是不好的,就像我相信它是坏的,允许用户以外的任何人可以访问用户的帐户。如果你看一下这个问题,整个前提是客户委托一个高度妥协的安全环境。

一个主密钥不必那样糟糕将第一似乎。我曾经在一个工厂的防御工作,他们认为需要对主机计算机操作员必须在某些场合“特殊通道”。他们简单地把特殊的密码在一个密封的信封,贴在运营商的服务。要使用密码(操作人员不知道),他不得不打开信封。在各个偏移变化的值班主管的工作之一是要看到,如果信封被打开,如果是的话立即更改该密码(由另一个部门)和新密码被放入一个新的信封,进程启动后所有再次。该运营商将受到质疑,为什么他打开它,事件将被记录备案。

虽然这不是我会设计一个程序,它的工作,并提供优秀的问责制。一切都被记录和审核,加上所有的运营商不得不国防部秘密间隙,我们从未有过任何虐待。

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

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

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

从小事是我了解这个问题上,我认为,如果你正在建设一个网站,一个点登录/密码,那么你应该甚至不看你的服务器上的明文密码的。密码应被散列,而且很可能咸鱼,它甚至离开客户端之前。

如果你从来没有看到明文的密码,然后检索的问题并不存在。

另外,我收集(从web)(可能)一些算法,诸如MD5不再被认为是安全的。我没有判断自己的方式,但它是值得考虑的。

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

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

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

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

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

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

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

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

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

该解决方案的一个变化是将操作请求发送给第三方可信管理员。这对于老年人、智障人士、幼儿或其他困惑的用户来说效果最好。当然,这需要这些人有一个值得信赖的管理员来支持他们的行动。

盐和 - 散列用户的密码为正常。当注销用户,同时允许用户的密码(盐析/散列后),而且还允许哪些用户输入的字面匹配了。

这允许用户输入自己的秘密口令,也可以让他们输入密码,这是有人会从数据库中读取的腌制/哈希版本。

基本上,使盐腌/哈希密码是同样是“明文”的密码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top