我正在设计一项服务,其中将存储敏感信息。为确保不会未经授权访问此信息,将使用从其密码(PBKDF2)派生的密钥对其进行加密。密码将以BCrypt哈希+盐化格式存储在数据库中。它永远不会以纯文本格式存储。

保存的信息的性质使得必须使用强密码。一些网站通过执行严格的字符准则来迫使其用户使用大熵构成密码。这些复杂的密码会导致在不同的网站上重复使用密码[1]。这是Bad Thing™[2]。

我宁愿让我的用户选择一个强度高并且不太可能在另一个安全性较低的Web服务上重复使用或使用的密码。 。因此,我正在考虑为我的用户使用类似于XKCD的[3]密码方案。

将从大于6个字符的大型单词列表中为用户显示4-5个不同的单词(不包括带有特殊字符的单词,仅包括ASCII)。密码输入对话框的格式应为4-5个字段,而不是普通的单个字段,以加强密码短语范式。注册后,可以随意重新生成密码,使用户能够选择包含容易记住的单词的密码短语。用户无法输入自己的单词。

我从个人经验中知道CreeperHost [4]已经使用了此方法,尽管只有一个密码字段包含四个串联的英语单词。

我的问题如下:


这种方法是否比允许用户自行选择更安全/有效?
有人对实施类似方案有任何经验吗? ?它有效吗?
是将密码字段分成多个唯一的有益字段还是公开太多信息?

我正在寻找与该特定方法的实际应用相关的答案(如果有)。我熟悉这种密码生成方法的理论优势和劣势。



密码重用的纠结网络-http://www.jbonneau.com/doc /DBCBW14-NDSS-tangled_web.pdf

密码重用-http://xkcd.com/792/

密码强度-http://xkcd.com/936/

Creeperhost-http://www.creeperhost.net/



评论

要求您的用户使用这种形式的密码有意义吗?可能会使使用密码管理器的用户烦恼。 (如果您以某种方式知道,您的用户都不会使用与此网站相关的密码管理器,那么我想可以)

就像一个个人问题一样,如果我可以选择使用自己编写的密码还是自己编写的密码,那么每次都会选择前者。尤其是因为我发现XKCD声称是虚假的,而且这四个词不容易记住,而且我绝对没有像他们所说的那样快地记住它们。我还知道有TED演讲提到此,该人表示测试表明它们不容易记住。 (如果我别无选择,我可能会将密码放在允许我设置密码的密码储物柜中。因此,我最好能够快速复制/粘贴。)

我总是讨厌网站强迫我使用一种特定的密码格式,最终是他们的数据,这取决于他们如何保护它。

@StephanHeijl:我希望您实际上只是在用它来加密真实密钥?

如果这是一项“可选”服务(例如,不是我的银行强加给我的一项服务),那么我会认为强迫我使用提供商所选择的密码的任何尝试都可能表示他们无知,而且几乎可以肯定会激励我从其他提供商那里购买我考虑要为您的网站提供的任何服务。

#1 楼

具体问题:

这种方法是否比允许用户自行选择更安全/有效?

是的。您将减少密码的重复使用并立即删除非常常见的密码。

是否有人有实施类似计划的经验?它有效吗?

过去我见过很多“替代”密码方案。大多数人只是在没有实质性提高安全性的情况下增加了支持问题和复杂性。

将密码字段划分为多个不同的字段是有益的还是暴露了太多信息?

我认为您已经击败了基本的自动无知识攻击只是因为与众不同。留下有针对性的攻击。但是,如果有公开注册可用,则攻击者可以发现您需要5个字或其他字词。因此,我认为您没有通过将攻击者分成多个字段来向其提供更多信息。

很明显,如果身份验证失败,则不提供有关哪个单词错误的建议-这会破坏安全性!

更多建议

关于可用性的其他答案还有很多其他好的建议。

如果安全性和可用性很重要,也许要看比密码更好的东西。短信吗?

很长一段时间都有可能使用密码,但仍然无法正确处理风险。用户计算机上的木马,通过被黑客入侵的电子邮件帐户进行的身份验证重置,网络钓鱼……在某些情况下,花哨的密码方案和控件不会引起混乱。

如果数据很重要,我会比密码做得更好。

(有时候,最好为用户生成一个随机密码,然后要求他们将其安全地存储在上锁的抽屉中,这会更好。这取决于您担心的威胁和攻击的种类,以及如何使用该系统。)

*基于风险的两因素验证方法google提供了很多说法,其中两因素验证仅偶尔触发。它控制成本并极大地提高了安全性。但是除非您有很多时间,否则我将外包给您:)

评论


这更像是我要寻找的答案。为了明确起见,身份验证确实需要额外的因素来执行,例如SMS。这个问题主要与数据加密-密码链接以及与暴露密码生成方法的性质相关的额外用户体验收益或障碍有关。

–斯蒂芬·海吉尔(Stephan Heijl)
15年1月2日,14:55

斯蒂芬-你是说你已经有了第二个因素,例如短信,无论如何都要登录?如果是这样,您可以降低密码的安全性而不会对风险造成太大影响。除非您处于高威胁环境中。

– JCx
2015年1月2日,15:19

第二个因素是执行所有登录。但是,由于所存储数据的敏感性,我担心降低密码(从中获得加密密钥)的安全性会带来太大的风险,如果包含加密文件的数据库被恶意捕获,黑客或政府干预。

–斯蒂芬·海吉尔(Stephan Heijl)
15年1月2日,15:35

在客户端执行解密,所有数据都通过HTTPS传输。由于这是企业应用程序,因此我的目的是防止办公室环境中的入侵或最终导致服务器卡死。

–斯蒂芬·海吉尔(Stephan Heijl)
15年1月2日,16:22

首先提出的要求是不合理的,并完全忽略了这个问题。许多用户拥有不满足您的愚蠢要求的安全模式,例如“正确的马钉电池”,因此他们不得不转而使用“ correctHorse4”。或者只是“ horse4abc”,因为您也连续两次禁止同一字符(看着您,USPS)。

–djechlin
2015年1月2日在22:06



#2 楼

允许任何密码。只需强调后果即可。

您的计划对用户来说很奇怪和陌生,我相信许多人宁愿停止使用您的服务也不愿遵守。您不是强迫他们选择自己的密码,而是强迫他们记住为他们选择的密码。这是大多数人无法接受的。您认为您可以通过“重试”来给他们一个选择,但是用户体验的差异与ATM和单臂匪徒差不多。

请记住,最大的问题是人为因子。首先应避免将密码写在白板上。这些家伙有一个非常安全的密码。然后在电视上播放。

如果要确保身边没有人可以破解它,那么您需要的是内部程序,而不是训练有素的用户。可能是通过与用户登录面板相同的重试限制来保护盐腌密码访问的系统。此外,让工人无法获得访问权也并不重要。商店的文员可以无限制地使用收银机。防止盗窃的是对不可避免后果的认识。使用管理会话记录。使用“最少2人可访问”的程序。银行就是这样做的,因为强大的用户密码不能保护所有内容。

评论


额外的想法:您认为信息很重要。但是,您永远不知道用户在其中放置了什么。我在6家银行有帐户,但其中5家银行的存款从未超过几十美元。但是那些银行仍然迫使我警惕几分钱。

–Agent_L
2015年1月2日,14:07



如果银行按存款金额设置了密码策略,那么有一天您可以从数千个帐户中提取所有款项,然后将其存入您的便士帐户中。如果与您无关的黑客在同一天突破了便士安全性,那将是一种耻辱。如果您当天收到数千笔神秘的电汇,那将是一个很大的巧合-这绝对不会减轻一分钱的银行兑现您数千美元的存款的负担。密码保护是为了保护银行,而不是您的。

–emory
2015年1月2日,14:39



@emory我不是在写有关银行分析我的余额的信息(当您设置第一次通过时,全新帐户的余额显然为0),我写的是我是唯一能够确定安全级别的人。银行已经有很好的保护,因为如果我忽略了密码管理,则不承担任何责任。但是,是的,他们正在保护自己的形象,即使“ money”的意思是“ 0.12美元”,“ Bank X失去了我的钱”标题也不是很好。

–Agent_L
15年1月2日,14:47

这个。尽管我热爱安全性,但在安全性之上添加烦恼并不等于更好的安全性

– Raestloz
15年1月5日在8:22

密码未隐藏的图片

–科尔·约翰逊(Cole Johnson)
2015年1月6日在6:34

#3 楼

您应该阅读有关Diceware的信息。您可以从一个小得多的列表中用四个单词获得44位的熵。如果您的列表是2050个左右的单词,并且您选择不替换,则每个单词将具有大约11位的熵,因为log2(2048)=11。使用5,000个单词,每个单词可获得12位。 (log2(4096)= 12)

我喜欢“重试”链接的想法,用户可以单击该链接,直到出现他们认为可以记住的组合为止。

关于您的问题的一件事使我感到困扰。如果数据是使用特定用户的密码加密的,则只有该用户才能解密数据。如果您的数据是按用户存储的,那就可以了。请注意,如果用户忘记了他或她的密码,那么如果密码是加密密钥,则数据是敬酒的。鉴于此,您可能真的想考虑一个非对称的键排列。

为了进行访问,请勿将输入分为四个字段。这为攻击者提供了攻击者不应拥有的信息。只需确定单词是否用空格分隔并告诉用户即可。

评论


尽管认识到使用密码作为密钥很重要,这意味着只有知道密码的人才能解密它(即,如果用户忘记了密码,则无法恢复数据),这很可能是一件好事,尤其是当准则为“否我们这边的人可以解密它。”如果您可以在忘记密码(以及在您仍然知道密码的同时提供给您的任何恢复密钥)的情况下恢复数据,则意味着另一端的人可以解密您的数据,这很不好。

–cpast
2015年1月1日在22:51

除了最后一段,我完全同意。它并没有真正给攻击者提供她否则不会拥有的任何重要信息-不仅密码短语中的单词数量不重要(长度不是熵的一部分),而且任何人都知道并透露了该信息。潜在的用户,攻击者很容易假装成。另一方面,好处是非常强大的用户教育-如果您想让他们习惯于四个单词的密码短语,那么这是非常需要的...

–AVID♦
2015年1月1日23:02



这是有意的,如果丢失了密钥,则数据不可恢复。这就是为什么我正在研究能够轻松记住结果的密码短语生成方法的原因。我喜欢Diceware的想法,但是我的用户的母语主要是荷兰语,所以我不确定他们提出的单词表是否合适。至于分开领域;我们不应该总是假设攻击者知道密码生成的方法吗?公开的信息量似乎微不足道,同时极大地增强了用户体验。

–斯蒂芬·海吉尔(Stephan Heijl)
2015年1月1日23:03

一个小型研究cups.cs.cmu.edu/soups/2012/proceedings/a7_Shay.pdf涵盖了密码短语的可用性方面,包括有关情绪,回忆,速度,字典选择,长度,有效性和用户倾向(如果系统生成密码短语)的数据。根据我所学到的知识,如果安全性更有用,更容易记住并且不会被写下来,那么它会更加有效。人们仍然会重用凭据。我没有足够的经验来了解BCrypt,但我已经看到了一些演示,其中应避免使用纯文本(尤其是空格,这些空格会显示文本)及其近似位置。

–ǝɲǝɲbρɯͽ
2015年1月2日,下午3:59

cmdqueue2是个很棒的发现。我阅读了这份研究报告,尽管它的范围有一定的局限性(无法接收新的密码短语,密码短语的30位熵。)它确实提供了对该问题的更多见解。如果您愿意,可以将其重新表述为答案,因为这是此问题中的重要资源。

–斯蒂芬·海吉尔(Stephan Heijl)
2015年1月2日于7:09



#4 楼

我看到这种方法的问题仅仅是它的非常规性质,这将减少人们甚至使用它的可能性。

我个人必须要有一个非常令人信服的理由来使用该方法。与传统的密码输入相反,您可以接受此服务。过去我曾评论说,我认为应用程序开发人员有责任确保用户使用强密码。然而;最终,这是用户的责任。

还请考虑,您正在强迫用户采用一种确保密码熵的特定方法。 XKCD方法很好,但是它不是唯一的方法,也没有绝对的,经验性的证据表明它是最好的,也不能保证如果今天是最好的,那么它将在六个月后仍然是最好的现在。

请考虑使用密码管理器,它可以生成非常大的,完全随机的密码,并自动为用户输入密码。您可能会用这种方法破坏这些应用程序。

还考虑使用诸如grc.com密码草堆文章之类的东西,该文章声称:

D0g.....................


...是比此密码更强的密码:

PrXyc.N(n4k77#L!eVdAfp9


...简单地是,尽管总体熵(随机性)相当高,但还有一个额外的字符密码不足,则用计算机花95倍的时间才能强行猜出更容易记住的密码。

问题在于,蛮力攻击仅在一定长度的密码(6到8个字符)中才真正使用,因为随着密码变得越来越长,计算开销很大。但是,即使是非常复杂的短密码也极易受到暴力攻击。较新的攻击是基于混合模式的攻击,将受破坏的密码用作较大密码中的模式。强大的GPU使这种方法可行,并且显然是非常有效的。简单地用.填充弱密码似乎不是一个好的解决方案。

还请参见本文,密码复杂性规则比烦人的规则更麻烦,效果不如冗长。

因此,至少最近的一些研究表明,密码强度最相关的因素是密码长度,至少部分原因是对于大多数用户而言,即使密码很短,复杂性也很高。 XKCD方法使人们容易记住很长的密码,而又不会使这些密码成为众所周知的简单模式或短语,从而有助于确保密码长度。那是(可能)它的最终强度-只是生成的密码的长度。话虽如此,我开始怀疑“正确的电池主力”能够抵御新型的基于混合模式的攻击要持续多长时间。

由于还有其他方法可以达到相同的结果,因此迫使用户如果没有相应的安全回报,这实际上可能会使您的服务更难以使用。另外,如果从六个月后开始在XKCD方法中发现某些弱点,那么您将陷入困境,必须花费大量的精力来更改服务。

评论


我同意这种方法有些不合常规。我只能想到两个使用强制的非用户密码/短语的服务。我应该补充一点,该解决方案设计的软件非常专业。人们在寻找该产品时会考虑安全性,但不一定是安全专家。虽然我同意密码haystacks方法可用于选择个人密码,但为每个用户生成该密码时,它会崩溃。为每个用户填充一个简单单词会减少对简单短语+字符*填充长度的搜索。

–斯蒂芬·海吉尔(Stephan Heijl)
2015年1月2日,12:45

关于在特定密码生成方案中发现的安全漏洞:我认为可以对任何方案进行相同的处理。从数学上讲,这种方法是正确的。

–斯蒂芬·海吉尔(Stephan Heijl)
2015年1月2日,12:47

#5 楼

听起来,这是防止密码重复使用的好方法,尽管您可能会将用户拉到他们的舒适区之外,但这可能会导致他们将密码保存到文本文件中,以便他们记住。您应该强调,用户必须记住他们的密码,或者使用密码管理器来安全地存储它(如果您和您的系统可以接受)。我还将确保多字段解决方案可与常见的密码管理器一起使用,尽管我看不到以这种方式拆分单词的任何其他问题。

由于将多个字段指定为密码的密码管理器功能可能是很难实现,我也将给用户提供使用自己的密码的选项,但是您应该声明用户只能使用安全生成的随机序列,例如,Keepass或LastPass中包含的密码生成器中使用的序列。为了防止用户输入他们总是使用的相同密码,可以在用户输入密码的情况下强制执行愚蠢的限制,以确保它实际上是唯一的。例如。至少50个字符,至少使用20个数字,并且必须包含小写/大写字母和至少一个符号。这将使专业用户感到满意,同时防止其他人使用弱口令(尽管您可能会使某些用户用45“ 2" s和一个” !“填充弱口令)。您可以尝试检测诸如此类的情况,然后加强消息该选项仅用于密码生成器,但是如果在极端情况下投入大量精力,则会减少收益。更好的选择是尝试向非专家用户解释生成的不同单词选项会更有益。


我正在设计一项服务,其中将存储敏感信息。为了确保我们这边的任何人都无法检索此信息,将使用从其密码(PBKDF2)派生的密钥对其进行加密。密码将以BCrypt哈希+盐化格式存储在数据库中。它永远不会以纯文本格式存储。


为了使基于密码的加密免受脱机攻击(例如,在您身边的人,或者如果另一个攻击者获得了访问权限)的安全,方式),则您需要熵为128位或更多,这意味着您需要10个随机字,而不是4或5个。虽然,当您使用PBKDF2增强密钥时,这可能会为您提供16位左右的附加熵(取决于迭代),因此仅需要9个字。我的观点是确保您进行数学计算以确保加密足够。

这将使普通用户更加难以记住密码,并且如果他们使用了密码管理器,也可以使用50个字符的选项,并让他们以这种方式登录。正如其他人指出的那样,这似乎可能潜在地产生许多支持请求,并且仅开发安全认证和会话管理系统的一部分就需要付出很多努力。

评论


相较于允许自定义密码而牺牲的安全性,即使是在需要荒谬的潜在熵标准的情况下,适应以某种方式在心理上跟踪40位以上的熵密码的边缘案例用户也似乎是在浪费时间。我将研究密码管理器的建议,因为这些建议正变得越来越流行,并且具有提供更多安全密钥的潜力。

–斯蒂芬·海吉尔(Stephan Heijl)
2015年1月2日,12:49



@StephanHeijl:同意。我在那里添加了该选项,因为实现五个字段选项以使其与多个基于浏览器的密码管理器兼容可能很困难。它也加强了“使用密码管理器消息”,因为我相信许多用户只会在只选择第一个选项的情况下将这五个单词保存在文本文件中。

– SilverlightFox
2015年1月2日,13:04

@StephanHeijl唯一真正相关的密码熵因素是密码的长度。要求使用25个字符的密码,不必担心其他“复杂性”因素,因为它们意义不大,而且您很容易就可以找到可靠的解决方案。

– Craig
2015年1月2日,18:18



@StephanHeijl许多用户只会将5个单词写在便签纸上,然后将其粘贴到显示器或键盘下。相信我-就是这样。 ;-)

– Craig
2015年1月2日,18:19

同意,尚无密码管理器的用户将面临以下选择:不安全地写下密码(很多人会这样做),尝试记住密码然后忘记密码以及使用密码重置(很多人至少会意外地这样做)一次),或者安装一些他们不知道为他们记住的软件(几乎没有人会这样做)。因此,要确定这种情况是否比使用和重用他们自己的弱密码会更好还是更糟,然后您就不去了。只是不要想象他们会遵循简单的说明,例如“记住此短语”。

–史蒂夫·杰索普(Steve Jessop)
2015年1月3日在2:09



#6 楼

您的方法很有趣,但我认为我不喜欢它。


您允许用户“旋转”,直到他们找到自己喜欢的密码。如果您使用四位数的数字进行此操作,恐怕有些人会一次又一次旋转直到他们以1234或0000结束。这会使攻击者感到高兴。
即使有很多组合,攻击者可以仅尝试使用您指定的结构的密码(实际上,他们可以使用您的服务来确定您使用的单词列表)。


#7 楼

在尝试实施任何密码策略之前,您确实应该看一下Rick Redman在AppSecUSA 2014上的精彩演讲,题为“您的密码复杂性要求是毫无价值的”:

https://www.youtube.com/watch? v = zUM7i8fsf0g

他讨论了使用所有人类用来创建密码的相似模式来破解密码。

#8 楼


会向用户显示一个包含超过6个字符的大型单词列表中的4-5个不同的单词(不包括带有特殊字符的单词,仅包含ASCII)。密码输入对话框的格式应为4-5个字段,而不是普通的单个字段,以加强密码短语范式。注册后,可以随意重新生成密码,使用户能够选择包含容易记住的单词的密码短语。用户无法输入自己的单词。


这将是一个问题。

这意味着您必须拥有一个单词列表正在密码短语中使用,并且与该列表没有偏差。

如果黑客能够以某种方式获得列表,无论是来自蛮力尝试,社交黑客入侵还是其他任何方式,那么他们都拥有单词列表,这对于他们来说要容易得多。找出密码。

如果您改为输入密码,以便用户可以输入自己的单词并允许使用数字和/或特殊字符,则密码短语将更加安全,并且您仍将保留它们避免使用与{wherewherewhere}相同的密码,因为您仍在强制使用4-5个单词作为密码短语。

事物的结合(其中一些已经被提及)


确保单词不要重复一次以上
不允许他们不止一次重复一个单词(passwordpassword
不要使用密码作为加密数据的密钥

这是一个非常糟糕的主意,尤其是如果用户忘记了密码并需要重新设置密码。


不要使用password scheme

,这为黑客消除单词和短语提供了线索,缩小字段。