当我继续建立越来越多的网站和网络应用程序时,我经常被要求存储用户的密码,如果/当用户有问题时,它们可以被检索(要么通过电子邮件发送一个忘记密码的链接,通过电话等),当我可以与这种做法作斗争时,我做了大量的“额外”编程,使密码重置和管理协助成为可能,而不存储他们的实际密码。
当我无法对抗它(或无法获胜)时,我总是以某种方式对密码进行编码,这样至少它不会以明文形式存储在数据库中——尽管我知道如果我的数据库被黑客攻击,罪犯不需要花费太多时间就能破解密码,所以这让我感到不舒服。
在一个完美的世界里,人们会经常更新密码,而不会在许多不同的网站上重复密码——不幸的是,我知道很多人都有相同的工作/家庭/电子邮件/银行密码,甚至在他们需要帮助的时候免费给我。如果我的数据库安全程序因为某种原因失败了,我不想成为他们财务崩溃的罪魁祸首。
从道德和伦理上讲,我觉得我有责任保护一些用户的生活,即使他们对他们的生活不那么尊重。
我确信有许多方法和论点可以用于盐散列和不同的编码选项,但当您必须存储它们时,是否存在单一的“最佳实践”?在几乎所有的情况下,我使用PHP和MySQL,如果这使任何不同的方式,我应该处理的细节。
Bounty的其他信息
我想澄清的是,我知道这不是你想要做的事情,在大多数情况下,拒绝这样做是最好的。然而,我并不是在寻求关于采用这种方法的优点的说教,我是在寻找如果你确实采用这种方法,应该采取的最佳步骤。
在下面的注释中,我指出了主要面向老年人、智障人士或非常年轻的人的网站,当他们被要求执行安全密码恢复程序时,他们会感到困惑。尽管在这些情况下,我们可能会发现这很简单,但有些用户需要额外的帮助,要么让服务技术人员帮助他们进入系统,要么通过电子邮件/直接显示给他们。
在这样的系统中,如果用户没有得到这种级别的访问帮助,来自这些人口统计数据的流失率可能会阻碍应用程序,所以请在回答时考虑到这样的设置。
谢谢大家
这是一个有趣的问题,有很多争论,我很喜欢。最后,我选择了一个答案,它既保留了密码安全性(我不必保留纯文本或可恢复的密码),又使我指定的用户群能够登录到一个系统,而不存在我在正常密码恢复中发现的主要缺陷。
像往常一样,由于不同的原因,大约有5个答案我想标记为正确,但我必须选择最好的一个——其余的都是+1。谢谢大家!
同时,感谢Stack社区中为这个问题投票和/或将其标记为最喜欢的人。我把获得100票作为一种赞美,希望这个讨论能帮助到和我有同样担忧的人。
刚刚看到这个有趣而热烈的讨论。
最让我惊讶的是,很少有人关注以下基本问题:
Q1。用户坚持访问纯文本存储的密码的实际原因是什么?为什么它这么有价值?
用户年龄大或小的信息并不能真正回答这个问题。但是,如果没有正确理解客户的关注点,如何做出业务决策呢?
为什么这很重要呢?
因为如果客户要求的真正原因是系统难以使用,那么解决具体原因可能会解决实际问题?
由于我没有这些信息,也无法与这些客户交谈,我只能猜测:这是关于可用性的,见上文。
我看到的另一个问题是:
Q2。如果用户一开始就不记得密码,为什么旧密码很重要?
这是可能的答案。
如果你有一只叫“miaumiau”的猫,用她的名字作为密码,但忘记了,你是更愿意被提醒它是什么,还是更愿意被发送像“#zy*RW(ew)”这样的信息?
另一个可能的原因是,用户认为想出一个新密码是一项艰巨的工作!所以,把旧密码发送回去给她一种错觉,让她不用再去做那件痛苦的工作了。
我只是想知道原因。但无论原因是什么,必须解决的是原因而不是原因。
作为用户,我希望事情简单!我不想努力工作!
如果我登录一个新闻网站看报纸,我想输入1111作为密码,然后就可以通过了!!
我知道这是不安全的,但我在乎别人访问我的“帐户”吗?是的,他也会看新闻!
网站是否存储我的“私人”信息?
我今天读的新闻?
那就是网站的问题,不是我的!
站点是否向已验证的用户显示私人信息?
那就先别表现出来!
这只是为了说明用户对问题的态度。
总之,我不认为这是一个如何“安全地”存储纯文本密码的问题(我们知道这是不可能的),而是如何解决客户实际关心的问题。
在独立服务器上打开一个数据库,并给每个需要此功能的web服务器一个加密的远程连接。
它不必是关系DB,它可以是具有FTP访问权限的文件系统,使用文件夹和文件而不是表和行。
如果可以的话,给web服务器只写权限。
像正常人一样,在网站的数据库中存储不可检索的密码加密(让我们称之为“pass-a”):)
对于每个新用户(或密码更改),在远程DB中存储密码的普通副本。使用服务器id,用户id和“pass-a”作为这个密码的组合密钥。你甚至可以在密码上使用双向加密,这样晚上睡得更好。
现在,为了让某人同时获得密码和它的上下文(站点id +用户id +“pass-a”),他必须:
入侵网站的数据库,以获得(“pass-a”,用户id)对或对。
从配置文件中获取网站的id
找到并侵入远程密码数据库。
您可以控制密码检索服务的可访问性(仅将其公开为安全的web服务,每天只允许一定数量的密码检索,手动进行,等等),甚至为此“特殊安全安排”收取额外费用。
密码检索数据库服务器是相当隐藏的,因为它不提供很多功能,可以更好地保护(你可以定制权限,进程和服务紧密)。
总而言之,你让黑客的工作变得更加困难。在任何一台服务器上出现安全漏洞的几率都是一样的,但是有意义的数据(帐户和密码的匹配)将很难组合起来。
刚刚看到这个有趣而热烈的讨论。
最让我惊讶的是,很少有人关注以下基本问题:
Q1。用户坚持访问纯文本存储的密码的实际原因是什么?为什么它这么有价值?
用户年龄大或小的信息并不能真正回答这个问题。但是,如果没有正确理解客户的关注点,如何做出业务决策呢?
为什么这很重要呢?
因为如果客户要求的真正原因是系统难以使用,那么解决具体原因可能会解决实际问题?
由于我没有这些信息,也无法与这些客户交谈,我只能猜测:这是关于可用性的,见上文。
我看到的另一个问题是:
Q2。如果用户一开始就不记得密码,为什么旧密码很重要?
这是可能的答案。
如果你有一只叫“miaumiau”的猫,用她的名字作为密码,但忘记了,你是更愿意被提醒它是什么,还是更愿意被发送像“#zy*RW(ew)”这样的信息?
另一个可能的原因是,用户认为想出一个新密码是一项艰巨的工作!所以,把旧密码发送回去给她一种错觉,让她不用再去做那件痛苦的工作了。
我只是想知道原因。但无论原因是什么,必须解决的是原因而不是原因。
作为用户,我希望事情简单!我不想努力工作!
如果我登录一个新闻网站看报纸,我想输入1111作为密码,然后就可以通过了!!
我知道这是不安全的,但我在乎别人访问我的“帐户”吗?是的,他也会看新闻!
网站是否存储我的“私人”信息?
我今天读的新闻?
那就是网站的问题,不是我的!
站点是否向已验证的用户显示私人信息?
那就先别表现出来!
这只是为了说明用户对问题的态度。
总之,我不认为这是一个如何“安全地”存储纯文本密码的问题(我们知道这是不可能的),而是如何解决客户实际关心的问题。