我应该如何道德地接近用户密码存储以便以后的明文检索?

时间:2010-02-17 19:54:40

标签: security password-encryption password-storage

随着我继续构建越来越多的网站和网络应用程序,我经常被要求以一种方式存储用户的密码,如果/当用户遇到问题时可以检索这些密码(要么通过电子邮件发送忘记的密码链接,请将它们带走通过电话等等。当我能够对抗这种做法时,我会做很多“额外”编程,以便在不存储实际密码的情况下进行密码重置和管理协助。

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

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

在道德和道德上,我觉得有责任保护一些用户的生活,即使他们以较少的尊重对待他们。 我确信有许多途径可以用来腌制哈希和不同的编码选项,但是当你必须存储它们时,是否有一个“最佳实践”?几乎在所有情况下,我都使用PHP和MySQL,如果这对我应该处理细节的方式有任何不同。

Bounty的附加信息

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

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

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

感谢所有人

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

一如既往,大约有5个答案,我希望因为不同的原因而被标记为正确,但我必须选择最好的答案 - 所有其他人得到+1。谢谢大家!

另外,感谢Stack社区中的每个人都投票赞成这个问题和/或将其标记为收藏。我以100票赞成票作为赞美,并希望这次讨论能帮助其他与我有同样关切的人。

26 个答案:

答案 0 :(得分:1039)

如何在这个问题上采取另一种方法或角度?问为什么密码必须是明文的:如果用户可以检索密码,那么严格来说你不需要检索他们设置的密码(他们不记得它是什么),你需要能够为他们提供可以使用的密码

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

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

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

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

我知道我更喜欢输入短语,并且使用copy-n-paste,这个短语也很容易使用密码,所以没有丢失。当然,如果您的网站(或任何受保护资产)不需要77位熵来生成自动生成的密码短语,请生成较少的单词(我相信您的用户会很感激)。

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

答案 1 :(得分:593)

想象一下有人已经委托建造了一座大楼 - 比如一个酒吧 - 并且会发生以下对话:

建筑师: 对于这样大小和容量的建筑物,您需要在此处,此处和此处使用消防通道。
客户: 不,维护过于复杂和昂贵,我不想要任何侧门或后门。
建筑师: 先生,消防通道不是可选的,根据城市的消防代码需要它们。
客户: 我不付钱给你争辩。按照我的要求做。

然后,建筑师是否会询问如何在没有消防通道的情况下合乎道德地建造这座建筑物?

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

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

计算机编程可能不是许可的专业,但人们似乎常常想知道为什么我们的专业不会得到与民用或机械工程师相同的尊重 - 好吧,不要再看了。那些职业,当交给垃圾(或完全危险)的要求时,将简单地拒绝。他们知道说这不是一个借口,“好吧,我尽了最大努力,但他坚持说,我必须做他说的话。”他们可能因为这个借口而失去执照。

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

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

答案 2 :(得分:206)

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

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

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

答案 3 :(得分:134)

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

答案 4 :(得分:95)

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

如果您的客户遇到问题,请告诉他们存储密码是违法的。无论如何,在英国,“1998年数据保护法”(特别是附表1,第II部分,第9段)要求数据管理员使用适当的技术措施来保护个人数据的安全,同时考虑到如果数据受到损害可能造成的伤害 - 对于在站点之间共享密码的用户而言,这可能是相当大的。如果他们仍然无法解决这个问题,请将它们指向一些真实的例子,例如this one

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

以下是我就此主题撰写的几篇博文:

更新:我们现在开始对未能正确保护用户密码的公司提起诉讼和起诉。示例:LinkedIn slapped with $5 million class action lawsuit; Sony fined £250,000 over PlayStation data hack。如果我没记错的话,LinkedIn实际上正在加密其用户的密码,但它使用的加密太弱而无法生效。

答案 5 :(得分:55)

阅读完本部分后:

  

在下面的注释中,我指出了这一点   网站主要面向   老人,精神上的挑战,或非常   年轻人可能会让人感到困惑   当他们被要求表演时   安全密码恢复例程。   虽然我们可能会发现它很简单   在某些用户需要的情况下平凡无奇   任何一方的额外援助   服务技术帮助他们进入   系统或通过电子邮件/显示它   直接给他们。

     

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

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

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

对于识字能力较差的人来说,这比被告知旧密码的情况更糟糕吗?虽然客户服务人员可以起到恶作剧的作用,但数据库本身在被破坏时更加安全。

评论我的建议有什么不好,我会建议一个实际上做你最初想要的解决方案。

答案 6 :(得分:42)

迈克尔布鲁克斯对CWE-257一直很直言不讳 - 无论你使用什么方法,你(管理员)仍然可以恢复密码。那么这些选择如何:

  1. 使用 其他人的公钥加密密码 - 某些外部授权。这样你就无法亲自重建它,用户将不得不去那个外部机构并要求恢复他们的密码。
  2. 使用第二个密码短语生成的密钥加密密码。执行此加密客户端,并且永远不会将其以明文形式发送到服务器。然后,要恢复,请通过从其输入重新生成密钥再次执行解密客户端。不可否认,这种方法基本上是使用第二个密码,但您可以随时告诉他们将其写下来,或使用旧的安全问题方法。
  3. 我认为1.是更好的选择,因为它使您能够指定客户公司内的某人持有私钥。确保他们自己生成密钥,并将其与指令一起存储在保险箱等中。您甚至可以通过选择仅加密并从密码中提供某些字符到内部第三方来增加安全性,这样他们就必须破解密码才能猜到它。将这些字符提供给用户,他们可能会记住它是什么!

答案 7 :(得分:28)

为了回应这个问题,用户已经对安全问题进行了大量讨论,但我想补充说明一些好处。到目前为止,我还没有看到提到的一个合法利益,因为系统上存储了可恢复的密码。考虑一下:

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

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

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

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

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

  • 让用户选择一个数字引脚,最好不要选择4位,最好只有在强力尝试受到保护的情况下才能使用。
  • 让用户选择一个简短回答的问题,只有他们知道答案,永远不会改变,他们会永远记住,而且他们不介意其他人发现。
  • 让用户输入一个用户名,然后绘制一个易于记忆的形状,并有足够的排列以防止猜测(请参阅this nifty photo G1如何解锁手机)。
  • 对于儿童网站,您可以根据用户名(类似于同一个用户名)自动生成模糊生物,并要求用户为该生物提供一个秘密名称。然后可以提示他们输入该生物的秘密名称以登录。

答案 8 :(得分:25)

答案 9 :(得分:21)

中途的房子怎么样?

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

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

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

答案 10 :(得分:13)

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

所以步骤是:

  1. 用户在您的网站上注册(当然是通过SSL)而无需设置密码。自动登录或提供临时密码。
  2. 您提供存储其公共PGP密钥以供将来密码检索。
  3. 他们上传了他们的公共PGP密钥。
  4. 您要求他们设置新密码。
  5. 他们提交密码。
  6. 使用可用的最佳密码哈希算法(例如bcrypt)对密码进行哈希处理。验证下次登录时使用此选项。
  7. 您使用公钥加密密码,并单独存储。
  8. 如果用户随后要求输入密码,则使用加密(非散列)密码进行回复。如果用户以后不希望能够检索他们的密码(他们只能将其重置为服务生成的密码),则可以跳过步骤3和7。

答案 11 :(得分:12)

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

答案 12 :(得分:11)

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

所以,当我必须建立一个需要存储可恢复机密信息的网站时,比如信用卡或密码,我做的是:

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

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

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

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

答案 13 :(得分:9)

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

某人的密码进入野外的成本是多少?在给定系统中冒充的成本是多少?对FBI计算机来说,成本可能是巨大的。对Bob的一次性五页网站来说,成本可以忽略不计。专业人员为其客户提供选择,并且在安全性方面,列出了任何实施的优势和风险。如果客户要求可能因为未能注意行业标准而将其置于风险之中,那么情况就更是如此。如果客户专门请求双向加密,我会确保您记录您的异议,但这不应该阻止您以您知道的最佳方式实施。在一天结束时,这是客户的钱。是的,你应该推动使用单向哈希,但要说这绝对是唯一的选择,其他任何不道德的行为都是完全无稽之谈。

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

我没有法律(英国的“数据保护法”),我知道具体说明密码必须使用单向哈希存储。任何这些法律中唯一的要求就是 合理的 步骤是为了安全起见。如果限制访问数据库,即使是明文密码也可以在这种限制下合法地获得资格。

然而,这确实揭示了另一个方面:法律优先权。如果法律优先权暗示您必须使用单向哈希给定您的系统正在构建的行业,那么这是完全不同的。这是你用来说服你的顾客的弹药。除此之外,最佳建议是提供合理的风险评估,记录您的异议并以最安全的方式实施系统,以满足客户的要求。

答案 14 :(得分:8)

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

答案 15 :(得分:7)

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

答案 16 :(得分:5)

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

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

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

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

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

我看到的另一个问题是:

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

这是可能的答案。 如果你有一只名为“miaumiau”的猫,并且使用她的名字作为密码,但忘了你做了,你是否愿意提醒它是什么,或者更喜欢被发送像“#zy * RW(ew”?

另一个可能的原因是用户认为提出新密码是一项艰苦的工作!因此,将旧密码发送回去会产生一种错觉,即将她从那次痛苦的工作中拯救出来。

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

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

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

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

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

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

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

答案 17 :(得分:5)

很抱歉,但只要你有办法解密他们的密码,就没有办法确保它的安全。辛苦地战斗,如果你输了,CYA。

答案 18 :(得分:4)

处理丢失/遗忘的密码:

没有人能够恢复密码。

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

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

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

答案 19 :(得分:3)

如果在加密丢失之前通过电子邮件发送明文密码呢?我已经看到很多网站都这么做了,从用户的电子邮件中获取密码比将它留在服务器/ comp上更安全。

答案 20 :(得分:3)

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

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

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

答案 21 :(得分:2)

从我对这个主题的了解,我相信如果您使用登录/密码构建网站,那么您根本不应该在服务器上看到明文密码。在密码离开客户端之前,密码应该经过哈希处理,并且可能已经腌制。

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

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

答案 22 :(得分:2)

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

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

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

-EDIT-回应关于没有主密钥的评论:我同意这是不好的,因为我认为允许除用户以外的任何人访问用户的帐户是不好的。如果你看一下这个问题,那么整个前提是客户要求一个高度妥协的安全环境。

主密钥不一定像最初看起来那么糟糕。我曾经在一家国防工厂工作,他们认为大型计算机操作员需要在某些场合“特殊访问”。他们只需将特殊密码放入密封的信封中,然后将其粘贴到操作员的桌面上即可。要使用密码(操作员不知道),他必须打开信封。在每次轮班更换时,轮班主管的一个工作是查看信封是否已打开,如果是,立即更改密码(由另一个部门更改)并且新密码被放入新信封并且过程全部启动再次。将询问操作员他为何打开它并将事件记录在案以供记录。

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

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

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

但是,如果这个可怜的家伙的客户有良好的管理,那么他们就不会首先要求这样一个安全可靠的解决方案,现在他们会这样做吗?

答案 23 :(得分:1)

正常地对用户密码进行加盐和哈希处理。在记录用户时,允许用户的密码(在salting / hashing之后),但也允许用户输入的内容也匹配。

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

基本上,使咸/哈希密码也是"纯文本"密码。

答案 24 :(得分:1)

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

  1. 用户注册后,即可获得完全访问权限(如常规用户) 网站)。注册必须包含电子邮件。
  2. 如果需要数据或操作,用户不需要 记住他们的密码,他们仍然可以执行操作 点击特殊" 向我发送电子邮件以获取许可"按钮,紧靠常规" 提交"按钮。
  3. 然后将请求发送到电子邮件,并附带一个超链接,询问他们是否希望执行操作。这与密码重置电子邮件链接类似,但不是重置密码,而是执行一次性操作
  4. 用户然后点击"是",它确认应该显示数据,或者应该执行操作,显示数据等。
  5. 正如您在评论中提到的,如果电子邮件遭到入侵,这将无法正常工作,但它确实解决了@joachim关于不想重置密码的评论。最终,他们必须使用密码重置,但他们可以在更方便的时候,或在管理员或朋友的帮助下,根据需要这样做。

    此解决方案的一个转折是将操作请求发送给第三方受信任的管理员。这对于老年人,精神障碍者,非常年轻人或其他混淆用户的情况最有效。当然,这需要一个值得信赖的管理员来支持他们的行动。

答案 25 :(得分:1)

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

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

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

  1. 破解网站的数据库以获得一对(“pass-a”,用户ID)对或对。
  2. 从某个配置文件中获取网站的ID
  3. 查找并入侵远程密码数据库。
  4. 您可以控制密码检索服务的可访问性(仅将其公开为安全的Web服务,每天仅允许一定数量的密码检索,手动执行等),甚至为此“特殊安全性”收取额外费用安排”。
    密码检索数据库服务器非常隐蔽,因为它不能提供许多功能,并且可以更好地保护(您可以严格定制权限,流程和服务)。

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