根据我对这个问题的评论:
几乎每个人都忽略了一个重要点......我最初的反应与@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 等,记录它并让客户(足够资深的人做出该决定)签署它。