我们的客户提出了一个要求,以防万一所涉及的用户名多次尝试登录失败,一旦成功登录,就必须显示输入错误的密码。正确输入的信息(包括以前的密码)在任何情况下都不会显示。

我们的首席开发人员告诉我们,从技术上讲,可以不对不正确的条目进行散列处理,但她对此功能极为不满意,因此非常不舒服。

相关网站是广泛的制图/ GIS应用程序,不包含任何货币交易。其他登录/身份验证选项包括Google / LinkedIn / Twitter / facebook,因此很明显没有密码要存储在此处,而主要是UX问题的处理。

实现此功能会带来哪些安全漏洞?我们的客户并非完全没有技术知识,所以一般的解释就足够了。

如果问题过于广泛或答案非常明显,我深表歉意。

评论

问客户为什么。然后问为什么他们说什么。他们可能有一个主意,但是肯定他们不想这样做。

巨大的法律责任-除非您让客户解除公司的所有法律义务,否则请不要执行

@timpone说什么。因为,正如infosec中的任何人都非常了解,人类通常有100个帐户(我有154个),而且没有人能记住所有这些,所以会发生重用。即使您的网站损失不大,即使用户与其他网站损失很少的口令共享密码(例如FooFlix,他将做什么,偷看一些电影?),当黑客找到一种方法(例如购买)时,也会感到惊讶数千美元的礼品会员资格。

(说服您的客户端,然后)使用标准的屏幕保护程序信息:“已进行X次不成功的登录尝试”。

高五的首席开发人员表示不满意,并激怒了这个问题!

#1 楼

主要问题是必须以某种方式存储不正确的密码,以便以后将其显示给用户。正如您的开发人员所指出的,这意味着它们不能首先被加密地进行哈希处理。结果是您将它们存储为纯文本格式(错误)或加密格式(更好,但通常不建议使用)。

最大的风险是攻击者可以访问此无效密码数据库。他们要么危及服务器,执行SQL注入或以其他方式检索它。他们可以使用无效密码历史记录中的信息来决定破坏帐户,而不是破解可能被高度哈希化并因此目标更严格的主密码。他们要么很容易访问纯文本密码,要么试图找到允许他们解密回纯文本密码的加密密钥。

登录失败的常见原因是在密码输入过程中输入错误。所以我的密码是Muffins16,但是我输入了mUFFINS16,因为我的大写锁定处于打开状态。还是Muffins166,因为我两次按下相同的键。还是Muffina16,因为我的手指碰错了键。如您所见,这些变体与原始变体足够接近,攻击者可能可以通过尝试一些较小的更改或将错误的密码与可能的词典单词或名称进行比较来从无效密码中确定有效密码。

此问题由于大多数人都使用与这些格式相似的密码选择,而不是随机字符串,因此情况更加恶化。如果您的无效密码为V8Az $ p4 / fA,对于攻击者来说,很难识别出打字错误,尽管尝试进行各种更改然后在没有任何信息的情况下进行猜测仍然容易得多。

另一个风险是,用户可能不记得在此站点上使用了哪些密码,因此他们尝试使用常见的密码。现在,此站点突然成为一个更大的目标,因为攻击者不仅可以利用那里的“无效”密码列表来破坏用户的帐户,而且还可以在其他站点上破坏用户的帐户。

您可以减轻一些威胁在有效登录后显示后立即擦除无效密码的存储可能会带来这些风险。这应该限制了攻击者访问数据并从中受益的机会之窗。

您可能应该问您的客户端的问题是,他们如何预测用户看到无效密码会从中受益。这样一来,用户就可以识别出他们输错密码的方式吗?打字错误不是故意的,因此向他们显示错误不会改善将来的登录尝试。这样,用户可以识别试图猜测其密码的攻击者吗?可以通过列出日期,时间,IP /地理位置或其他信息(对于没有尝试密码的无效尝试)提供类似的反馈。因此用户知道他们在输入密码时搞砸了,并且不怪网站的登录系统吗?这似乎是唯一具有优点的方法,我不确定它是否能提供足够的价值来证明风险。

我的猜测是,一旦您更好地了解了他们正在尝试使用此功能完成的工作,可能会建议更安全的选择。

评论


您的电子邮件地址是什么,因此我可以尝试使用密码Muffins16吗?我的意思是,与您进一步讨论这个重要话题?

– corsiKa
2016年9月9日在22:49

显然,这是一个把戏,真正的密码是mUFFINS16。

–史蒂夫·杰索普(Steve Jessop)
16 Sep 10'在10:09



破解数据库非常容易,只需在窃取加密数据库之前对数十个帐户尝试1000次不正确的密码尝试即可。瞧,您现在在数据库中有数千个“已知明文”错误密码,您可以从中计算出加密密钥。

–通配符
16年9月10日在18:36

@Wildcard嗯,什么?为什么已知的明文会帮助破解现代加密算法的密钥?

–本
16 Sep 10'在19:56

@vlaz的要点是,现代加密技术不容易受到已知明文攻击,因此拥有任意数量的已知明文都不会帮助您破解加密密码。

–蜘蛛鲍里斯(Boris)
16/09/11在9:47

#2 楼

tldr;这比不散列密码并将其存储为纯文本格式更为糟糕。

我同意您的主要开发人员的担心。为了显示过去不正确的密码尝试,您必须以可逆方式存储它们,这意味着它们不能被散列。如果有人破坏了系统,那么他们将可以访问所有错误尝试,并且可能会拼凑某些用户的真实密码。例如,如果您可以看到我的一些不良尝试:

correct horrse battery staple
correct horse batttery staple


弄清楚我的实际密码将非常容易。

我也同意drewbenn的回答:如果我输入的用户名不正确,但输入的密码正确,而错误的用户名恰好是其他人的用户名,则该用户可以看到我的真实密码。

评论


另一个漏洞:成功登录后,任何也在查看屏幕的人都可以看到错误的尝试,而不必获得对数据库的访问权限。

– Milo P
2016年9月9日22:00

同样,一旦哈希值正确,您就不能丢弃正确的密码(电池钉)。您必须等到检查完之后才能知道要保留还是清除它。

– Ghillie Dhu
16-09-10的1:10

@GhillieDhu这是一个很短的时间窗口,密码仅在RAM中。 (并且密码已经在RAM中,因此您可以对其进行哈希处理,再将其保留几毫秒将不会有任何重要作用)

–user253751
16/09/12在7:21



这个答案的最下段几乎是最该死的例子,表明永远不要这样做。

–胸骨
16/09/13在4:39

它不应该说tsdr;吗?

– NuWin
16 Sep 14 '17:59

#3 楼

一旦我尝试使用密码而不是同事的用户名登录系统。

然后,在尝试登录共享帐户时,我总是会使用错误的密码。

而且我知道很多管理员都可以访问其老板的帐户,以便他们可以完成工作。如果他们的老板从未输入过错误的密码,然后在正确登录以清除错误之前被访客分心,我会感到非常震惊。

加上有人在我站在我肩膀上时出现的所有错字正在登录。

在所有这些情况下,有时我会在工作时在密码提示中输入我的gmail或lastpass密码,反之亦然。

我用密码搜索谷歌的时间是因为我没有看着屏幕,只是认为它已被锁定。并不是说这与您的建议有任何关系,而是我喜欢分享这个轶事,因为它提醒人们每个人都可能犯错,有时还会输入错误的内容。

此hUnt3r2feature唯一要做的就是将小错误(输入错误的密码或输入错误的密码)转变为更广泛的受众意外接触。

评论


如果我想破解您的帐户drewbenn,我所要做的就是设置您的用户名的几种常见类型:drewben / derwbenn / ...,然后等到您输错用户名并将密码发送给我:-o

– Falco
16年9月12日在7:51

@Falco,您应该添加它作为答案。这是在这样的系统上主动攻击用户的好方法(假设目标是通用的(并且是好的)安全措施,其中“错误的密码”返回与“无效的用户”相同的错误代码),这对于目标系统是不可见的。

–user15392
16年9月12日在20:51

#4 楼

声誉损失
考虑到在许多情况下使用失败的登录尝试来攻击其他站点的情况,采用这种机制将立即导致声誉损失。这是一个示例:

马克(扎克伯格)使用他的网站TheFacebook.com来查找该网站的成员,这些成员将自己标识为绯红色的成员。然后,他检查了登录失败的日志,以查看是否有任何Crimson成员曾经在TheFacebook.com中输入错误的密码。如果他们输入的案例登录失败,则Mark尝试使用它们访问Crimson成员的哈佛电子邮件帐户。他成功访问了其中两个。
换句话说,马克似乎使用了来自TheFacebook的私人登录数据来入侵某些TheFacebook用户的单独电子邮件帐户。

来源:马克·扎克伯格入侵哈佛深红色
替代方法
如果您的客户全心全意地尝试在下次成功登录时显示失败的登录尝试(作为一种很好的措施),我是否可以建议替代方法?不用显示失败的密码,而是显示提交错误密码的浏览器的IP地址和地理位置信息。应该相当容易做到,不会引起安全问题,并且在实际恶意活动的情况下会提供更多有用的信息。

评论


不错的选择!它可能会扩展为还包括有关失败密码与真实密码的接近程度的统计信息,例如“ 4%差异”。因此,用户甚至可以更好地判断什么是她自己的失败登录尝试以及什么是黑客尝试。但是难以实施,因为我们只能安全地以明文(在哈希之前登录时)访问失败的密码或真实密码,而无法存储它们。功能加密是否可能?

– Tanius
2016年9月9日在22:50

@tanius不,该站点不应该能够计算出该差异!

–冈伯特
2016年9月11日14:01在

您提到的替代方法是,当您的帐户被盗但攻击者无法访问您的第二授权因子时,Steam会发生什么。您会看到哪个设备正在尝试获得访问权限,以便您可以验证是否破坏了某些内容或受到攻击。它工作得很好,并且比OP客户提出的要好得多。

–桅杆
16/09/11在16:34



@guntbert,在显示错误密码时,即使用户正确输入了正确的密码,也可以将其用于比较,因为用户只是输入了密码。

–本
16年9月12日在12:38

@Ben正确,但是存储了错误的密码是问题所在(无法进行哈希处理)。

– maaartinus
16年9月12日在13:49

#5 楼

出于安全原因,请不要这样做:错误的登录垃圾邮件。

我对您的应用程序运行了电子邮件/用户名列表。我尝试使用相同的“密码”登录每个帐户。也许是一个冒犯性的短语;政治口号,或仅仅是某个网站的广告。

然后您的每个用户登录时,使用我猜想的用户名/电子邮件被迫查看我输入的内容。

它为每个匿名人员提供了一个访问方向向用户显示内容。

如果每个同事都使用该服务,并且他们可能会猜中彼此的登录名,这甚至可能导致骚扰或其他工作场所人为问题。

评论


我认为这是一个非常重要的问题,尚未引起足够的重视。

–亚历杭德罗·皮亚德(Alejandro Piad)
16/09/16在18:22

我以前没有考虑过,但这实际上是一个安全问题。

–emory
16-09-19在17:31

#6 楼

当我想与您的同事坐在一起时要登录您的应用程序会怎样?假设我输错了密码。现在我是否需要在登录时将他送走,以免他看不到我的密码?

评论


“当我想登录到您的应用程序并且与同事坐在一起时会发生什么?” -我认识一个人,整个实验室都是博士生,他们通过观察彼此的输入来训练自己读取彼此的密码。显然可以帮助查看几次。一定是在这里笑了一分钟,如果您这样做,您会从中获得所有乐趣。安全规则第一:不要成为傻瓜,让攻击者保持挑战。

–史蒂夫·杰索普(Steve Jessop)
16 Sep 10'在10:13



#7 楼

如果有具有相似用户名/电子邮件地址的用户,他们可能会意外地尝试登录另一个用户的帐户。

然后,恶意用户可能会使用其“不正确”密码尝试列表来侵入具有相似用户名/电子邮件地址(例如bill11,bill1等)的帐户。

我认为最好只列出错误和成功的登录尝试以及时间和相关的IP地址。

评论


对我来说,这似乎比公认的“如果数据库被错误控制会怎样”风险更大。我尝试注册有许多系统,使用我的首选用户名,然后遍历其他系统。一段时间后,我忘记了我用于特定站点的信息,因此在缺席后尝试登录时,必须循环浏览它们。但是我的密码始终是根据站点名称加上年份以及其他详细信息计算得出的,因此保持不变。因此,尽管数据库可能落入错误的手,但仍有一些用户会看到其他人的正确密码。

– Dewi Morgan
16年9月12日在4:44

#8 楼

我同意其他答案,指出如果攻击者掌握了失败尝试的列表,则可以轻松猜测用户的密码。

在这种情况下,您的系统不包含任何货币交易信息都没关系。用户通常在多个站点上使用相同的密码或相同密码的变体。建议他们不要这样做,但是还是会发生。因此,仅因为您不觉得您的系统本身就公开了敏感信息,并不意味着如果您的系统受到威胁,您的用户的敏感信息也不会受到威胁。

如果Joe User在您的系统上使用了相同的密码就像他用于银行的系统一样,如果攻击者能够在您的系统上猜出他的密码并弄清楚Joe使用了什么银行,那么攻击者就可以访问Joe的银行帐户。或病历,或任何其他系统,乔(Joe)都在使用该密码。

您不仅在保护系统密码。

评论


如果我为您的系统错误输入了我的最高机密银行密码,该密码也会被记住。

– gnasher729
16/09/10在15:24

#9 楼

我怀疑您的客户患有XY问题。这意味着退后一步,尝试弄清楚客户的真正需求。通常,知道有人尝试输入错误的密码以及如何输入此密码(不一定是该密码是什么)很有用。也许客户只是希望有足够的信息来区分良性威胁(例如,用手指粗暴地指望自己的密码)和更可疑的威胁(例如,在从未登录过的设备上从全国各地猜测密码)。

,所以向您的客户端询问威胁模型,并查看以下信息是否足够:


身份验证失败的用户ID(以便您知道每次失败时应向谁发出警告) )
日期和时间
客户端IP地址,用户代理和大致地理位置
客户端是否运行JavaScript(攻击者通常不会打扰)
客户端是否提供了Cookie曾经成功登录过

,然后当用户在一次或多次失败后成功登录时,会基于此信息显示警告框。

评论


如果进行了多次尝试,则警告框可能不足。此外,如果需要,用户应该可以返回列表

–pppp
16-09-13在19:27

到目前为止,不显示旧密码的最好原因是,确实不需要做一些棘手的事情。 -我对人们为什么要这么做的第一个想法是,他们不相信自己的手指粗拙,在这种情况下,您可以简单地使用主要软件解决方案中实现的“点击插入来显示密码”之类的东西。

– Dennis Jaheruddin
16 Sep 14'在14:02

#10 楼

我不愿意在这里补充本已很好的答案,但是还有另一个重要的观点。除非您绝对确定用户仅通过HTTPS连接到该站点(并且实际上,甚至还没有,否则),您甚至都永远不会有机会显示错误的密码...,因为它们永远不会在密码中传输(无论是否加密)。第一名。客户端系统应该只传输盐腌哈希,而不是实际密码(在适当的实现中,以确保哈希本身不会成为密码,即可以被窃取和重用的密码),以防止窃听攻击。 br />
网站不在处理金融交易也没关系。您仍然不希望它成为某些链条中最薄弱的环节。

所以我完全同意您的首席开发人员。我会为此而抗争。

评论


这样服务器就必须存储客户端生成的盐化哈希值是什么?这与仅通过安全通道发送密码并让服务器使用真实的密码摘要算法(例如pbkdf2,bcrypt或scrypt)对其进行哈希处理有什么功能区别,如果在浏览器(a)和(b)中均未实现这些算法,客户端发送一个散列,它所做的只是证明它知道该散列,而不是它知道实际的密码,这最终比发送密码和在服务器上进行真正的加密安全性低。

– Craig
16-09-20在8:15



JavaScript中有bscrypt / scrypt实现。并且双重哈希可以确保客户端发送的内容不会成为密码(无法重复使用)。对于任何实现,我都会担心的是如何为第二个哈希创建,存储和发送给客户端一个不可预测的盐。

–维克多·托特(Viktor Toth)
16-09-20在14:48

如果服务器正在向客户端发送JavaScript以对密码进行哈希处理,则您仍在向服务器所有者扩展相同级别的信任,此外,您还为中间的人提供了向您发送更改后的脚本的机会,再加上删除服务器轻松版本控制,升级和控制使用中的加密协议的能力,再向任何可能的攻击者确切地说明您正在使用哪种协议以及进行多少轮攻击,等等。我仍然发现问题多于好处,恭敬。

– Craig
16-09-20在15:23

本质上,但这只是我的观点之一。该安全通道是具有前向保密性的HTTPS,并且已经存在。如果服务器正在向您发送脚本来处理您的密码,则服务器也可以在假定通道安全的情况下仅处理您的密码。客户端上的哈希没有净收益,但是客户端上的哈希有很多潜在的问题。

– Craig
16-09-20在15:32



我们一直在收到“聊天”警告。但是您的建议是要求服务器将两种盐都传递给客户端,因为肯定不能依靠客户端来记住原始的盐。当密码哈希最初存储在服务器上时,必须将纯文本密码传递到服务器,或者必须发送原始的加盐哈希,并且该密码可以被拦截。正如我之前提到的,这使对密码哈希算法进行版本控制变得更加困难且容易出错。我只是看到很多洞。 ;-)

– Craig
16-09-20在21:15

#11 楼

可能的解决方案:由于这里的关注点在于以明文形式存储错误的密码尝试,因此请避免这种情况。设置用户密码后,生成公用密钥和专用密钥对。存储用密码加密的公钥和私钥。记录不正确的密码时,请使用公共密钥加密它们(并添加盐)。这样,只有知道正确密码的用户才能看到错误密码。

评论


这似乎是解决主要问题的可行解决方案。由于意外使用您的用户名登录,它仍然无法解决看到他人密码的问题。当然,更改密码后解决方案将失败。但是好主意。向我+1。

– TTT
16-09-10的15:04

这不能防止依赖于用户名键入错误的攻击。

–迈克尔
16年9月12日在21:15

在所有其他原因中,我认为这是个坏主意,使用非对称密钥加密和解密数据实际上比对称加密慢几个数量级。服务器上的额外负载简直是荒谬的。

– Craig
16-09-20在8:05



@Craig如果仅使用非对称密码进行加密,SSL是否不需要大约相同的负载?

– v7d8dpo4
16-09-20在12:58

SSL使用非对称加密来安全地生成和共享对称加密密钥,然后将其用于对传输中的所有数据进行加密。

– Craig
16-09-20在14:09

#12 楼

您的系统将具有大型的可解密密码数据库。查找用户X的错误密码,您将获得X帐户几乎但不是完全正确的密码,用户X的不同帐户的正确密码,以及用户名与X几乎相同的用户的帐户的正确密码。

合理假设黑客可能会闯入您的系统并获得数据库的解密副本,这将是灾难性的。即使假设错误的人对您的系统的访问不太重要,该数据库也将包含不同系统的用户密码,这可能更为重要。

#13 楼

在我看来,在正确构造的身份验证中,用户输入的密码甚至都不会传输到主机站点,因此存储不正确尝试的问题就没有意义了。

拥有一个界面中的“查看密码”复选框,
严格是本地功能,可以在键入密码
或尝试失败后使用。可能应该在短时间后擦除保存的信息
,以防止从废弃的控制台中获取密码。

评论


??您在网站上输入的密码始终会传输到主机服务器以便进行验证。无法信任客户端对其自身进行身份验证,并且客户端的哈希/模糊处理毫无意义。希望使用SSL / TLS传输密码,因此在传输过程中会对其进行加密,但是无论如何都会将其发送到服务器。

– Flaambino
16-09-15在21:23

不,有一些变化;服务器为您提供一个随机字符串,您使用该随机字符串对密码进行哈希处理,然后将其传递回服务器,服务器将您发送的内容与预期结果进行比较,证明您知道密码。

– ddyer
16 Sep 16'4:51

并证明服务器以明文形式存储所有密码。否则它将无法进行哈希处理。因此,这是一个更糟糕的解决方案。

– Flaambino
16-09-16在6:46

不一定,它取决于确切的哈希协议。例如,使用已知的固定方法对密码进行哈希处理,该方法理论上可以重现服务器存储的内容。然后使用新呈现的随机值对结果进行哈希处理(避免重播攻击)。

– ddyer
16/09/16在15:14

@ddyer您如何建议服务器知道预期的结果,除非服务器使用相同的算法对密码进行哈希处理以进行比较?经过精心审核的建立安全通道的握手就是HTTPS的全部目的。自行拥有加密很难正确进行。

– Craig
16-09-20在20:44