您想知道的有关安全重置密码的所有信息。第1部分

我最近有时间重新思考安全密码重置功能的工作方式,首先是在将其构建到ASafaWeb中时,然后是在我帮助另一个人执行类似操作时。在第二种情况下,我想给他一个到规范资源的链接,其中包含安全执行重置功能的所有详细信息。但是,问题在于这种资源不存在,至少有一种资源描述了对我而言似乎很重要的所有内容。所以我决定自己写。



您会发现,忘记密码的世界实际上是非常神秘的。有很多不同的,完全可以接受的观点,也有很多非常危险的观点。您很可能以最终用户身份多次遇到它们。因此,我将尝试使用这些示例来说明谁在做正确的事,谁在做不正确的事,以及在正确实现应用程序中的功能时应关注的重点。







密码存储:哈希,加密和(哦!)纯文本



在讨论如何存储忘记的密码之前,我们无法讨论如何处理忘记的密码。在数据库中,密码以三种主要类型之一存储:



  1. 简单的文字。有一个密码列,以纯文本形式存储。
  2. . ( ), .
  3. . ( , ); , , , .


让我们直接回答一个最简单的问题:永远不要以纯文本形式存储密码!决不。一个单一的注入漏洞,一个无意间制作的备份副本或数十个其他简单的错误之一-就是这样,玩家,所有密码-也就是说,很抱歉,您所有客户的密码都将成为公共领域。当然,这将意味着它们在其他系统中所有帐户中的所有密码将成为公共域的巨大可能性。那将是你的错。



加密更好,但也有缺点。加密的问题是解密。您可以采用那些看起来很疯狂的密码,然后将其转换回纯文本格式,一旦发生这种情况,我们将以可读的密码返回到这种情况。这是怎么发生的?解密密码的代码中有一个小漏洞,该密码可公开使用-这是一种方法。黑客可以访问存储加密数据的计算机-这是第二种方法。同样,另一种方法是窃取数据库的备份,并且有人还会获得加密密钥,该密钥通常存储得很不安全。



这将我们带入哈希。散列背后的想法是,它是通过一种方式完成的。比较用户输入的密码与其哈希版本的唯一方法是哈希输入的密码并进行比较。为了防止像彩虹表工具的攻击,我们使用盐添加随机性过程(读我的岗位上加密存储为一个完整的画面)。最终,如果实施正确,我们可以放心地假设,散列密码再也不会成为纯文本了(我将在另一篇文章中讨论各种散列算法的好处)。



关于散列和加密的一个快速争论:您需要加密而不是散列密码的唯一原因是,当您需要以纯文本格式查看密码时,并且至少在标准情况下您永远都不想这么做。网站。如果您需要它,那么很可能您在做错事!



注意!



该帖子的下方是色情网站AlotPorn的屏幕截图的一部分。它整齐地裁剪,因此在海滩上看不到任何东西,但是如果它仍然可能引起一些问题,请不要向下滚动页面。


一律重设密码,从不提醒



是否曾经要求您创建密码提醒功能?退后一步,以相反的方式考虑此请求:为什么需要此“提醒”?因为用户忘记了密码。我们真正想做什么?帮助他再次登录。



我知道(经常)经常使用“提醒”一词,但是我们真正想做的是安全地帮助用户再次上网。由于我们需要安全性,因此提醒(即向用户发送密码)不合适的原因有两个:



  1. — . , HTTP ( HTTPS), , . , , , , , , , . — .
  2. . — ( ), .


让我以usoutdoor.com为例说明问题:这是一个典型的登录页面:





显然,第一个问题是登录页面未通过HTTPS加载,但该站点还提供了发送密码(“发送密码”)的功能。这可能是上述术语在口语中使用的一个示例,因此让我们更进一步,看看会发生什么:





不幸的是,它看起来并不好。并通过电子邮件确认问题:





这告诉我们usoutdoor.com的两个重要方面:



  1. 该网站不会对密码进行哈希处理。充其量,虽然它们是加密的,但很可能以纯文本形式存储;我们没有相反的证据。
  2. 该站点通过一个不安全的渠道发送了一个长期密码(我们可以回去一次又一次地使用它)。


考虑到这一点,我们需要检查重置过程是否正在安全地执行。这样做的第一步是确保请求者有权执行重置。换句话说,在此之前,我们需要进行身份检查;让我们看一下在不首先验证请求者确实是帐户所有者的情况下验证身份时会发生什么。



列出用户名及其对匿名性的影响



最好从视觉上说明此问题。问题:





看到?请注意消息“没有使用该电子邮件地址注册的用户”(“没有使用该电子邮件地址注册的用户”)。如果这样的站点确认存在使用该电子邮件地址注册用户,则显然会出现问题。宾果游戏-您刚刚发现了您的丈夫/老板/邻居色情恋物癖!



当然,色情是隐私重要性的一个相当典型的例子,但是将人与特定网站关联的危险比上述潜在的令人尴尬的情况要广泛得多。危险之一是社会工程学。如果攻击者可以为某人提供某项服务,那么他将获得可以开始使用的信息。例如,他可能会与冒充网站发言人的人联系,并要求提供更多信息,以图谋骗网络



这样的做法也增加了“枚举用户名”的危险,在这种情况下,可以通过简单的组查询来验证网站上是否存在用户名或电子邮件地址的整个集合,并检查对它们的响应。您是否有所有员工电子邮件地址的列表以及几分钟的脚本编写时间?然后,您会看到问题所在!



有什么选择?实际上,它非常简单,并且在Entropay中实现良好





在这里,Entropay完全不向不拥有该电子邮件地址的任何人公开其系统中是否存在电子邮件地址如果您拥有此地址,但系统中不存在该地址,则会收到如下电子邮件:





当然,在某些情况下,有人认为他们已经在网站上注册。但不是,或者是通过其他邮件地址发送的。上面显示的示例很好地处理了两种情况。显然,如果地址匹配,那么您将收到一封电子邮件,可以更轻松地重置密码。



Entropay解决方案的精妙之处在于,在进行任何在线验证之前,都会先通过电子邮件完成身份验证。一些网站在问用户一个秘密问题(下面有更多问题)之前重置如何开始;但是,这样做的问题是,您需要在提供某种形式的标识(邮件或用户名)的同时回答问题,这使得几乎不可能直观地回答不透露匿名用户帐户的存在。



这种方法的可用性略有下降,因为在尝试重置不存在的帐户时不会立即得到反馈。当然,这就是发送电子邮件的全部要点,但是从真正的最终用户的角度来看,如果他输入了错误的地址,则只有在他收到电子邮件后才第一次发现该地址。这可能会引起他的紧张,但这对于这样一个罕见的过程来说是很小的代价。



另一个旁注,有点偏题,显示正确的用户名或电子邮件地址的登录帮助功能也有同样的问题。始终用“您的用户名和密码组合无效”消息答复用户,而不是明确确认凭据的存在(例如,“用户名正确,但密码输入错误”)。



发送重置密码与发送重置URL



我们需要讨论的下一个概念与重置密码的方式有关。有两种流行的解决方案:



  1. 在服务器上生成新密码并通过电子邮件发送
  2. 发送具有唯一URL的电子邮件以简化重置过程


尽管有许多教程,但切勿使用第一点。它的问题是,这意味着有一个存储的密码可以随时返回并重新使用。它是通过不安全的渠道传输的,并保留在您的收件箱中。收件箱可能会同步到移动设备和电子邮件客户端,此外,它们可以在线存储在Web电子邮件服务中很长时间。关键是不能将邮箱视为长期存储的可靠介质



但是除此之外,第一段还有另一个严重的问题-尽可能简化具有恶意意图的帐户锁定。如果我知道网站上拥有该帐户的人的电子邮件地址,那么我可以随时通过重置密码来阻止他;这是拒绝服务攻击,位于白银盘上!这就是为什么仅在与请求者成功检查其权限之后才能执行重置的原因。



当我们谈论重置URL时,是指该重置过程的特定实例唯一的网站地址。当然,它应该是随机的,不容易猜测,并且不应该包含任何外部帐户链接以使其易于重置。例如,重置URL不应只是“ Reset /?Username = JohnSmith”之类的路径。



我们希望创建一个唯一的令牌,该令牌可以作为重置URL通过电子邮件发送,然后针对用户帐户针对服务器记录进行验证,从而确认帐户所有者确实是试图重置密码的同一个人。 ...例如,令牌可以采用“ 3ce7854015cd38c862cb9e14a1ae552b”的形式,并与重置用户的用户ID和令牌生成的时间一起存储在表中(有关更多信息,请参见下文)。发送电子邮件时,它包含一个URL,例如“ Reset /?Id = 3ce7854015cd38c862cb9e14a1ae552b”,当用户加载该电子邮件时,页面会询问令牌是否存在,此后它会确认用户信息并允许更改密码。



当然,由于上述过程(希望)允许用户创建新密码,因此请确保通过HTTPS加载URL。不,仅通过HTTPS发送POST请求是不够的,带有令牌的URL必须使用传输层的安全性,这样就不可能在新的密码输入表单上执行MITM攻击,并且用户创建的密码是通过安全连接传输的。



另外,对于重置URL,您需要添加令牌时间限制,以便可以在一定间隔(例如一个小时内)内执行重置过程。这样可以确保重置窗口最小,以便此重置URL的接收者只能在这个很小的窗口内运行。当然,攻击者可以再次启动重置过程,但是他将需要获取另一个唯一的重置URL。



最后,我们需要一次性完成此过程。重置过程完成后,必须删除令牌,以便重置URL不再起作用。需要上一点,以便攻击者拥有一个非常小的窗口,在此窗口中,他可以操纵重置的URL。另外,当然,在成功重置之后,就不再需要令牌。



这些步骤中的某些步骤似乎过于多余,但它们根本不会干扰可用性,并且实际上会提高安全性,尽管在我们希望这种情况很少发生的情况下。在99%的情况下,用户将在很短的时间内进行重置,并且在不久的将来不会再次重置密码。



验证码的作用



哦,验证码,我们都喜欢讨厌的补救措施!实际上,CAPTCHA并不仅意味着身份保护,还意味着您是人类还是机器人(或自动脚本)。其目的是避免自动提交表单,这当然可以用作破坏安全性的一种尝试。在重设密码的情况下,CAPTCHA表示无法强行破解重设功能以向用户发送垃圾邮件或尝试确定帐户的存在(当然,如果您遵循身份验证部分的建议,则不可能)。



当然,CAPTCHA本身并不理想。其软件“黑客”并取得足够的成功率(60-70%)有很多先例。另外,我的帖子中显示了一个有关用自动化人员入侵CAPTCHA的解决方案,您可以付给人们一分钱的钱来解决每个CAPTCHA,并获得94%的成功率。也就是说,它很脆弱,但是(略)增加了进入的障碍。



让我们看一下PayPal示例:





在这种情况下,重置过程根本无法在解决验证码之前启动,因此从理论上讲不可能自动执行该过程。理论上。



但是,对于大多数Web应用程序来说,这将是多余的,并且肯定会降低可用性-人们只是不喜欢CAPTCHA!另外,CAPTCHA是可以在需要时轻松重新访问的东西。如果该服务开始受到攻击(此处提供了方便的日志记录,但稍后会进行更多介绍),那么添加CAPTCHA绝非易事。



秘密问题和答案



通过我们研究的所有方法,仅通过访问电子邮件帐户就可以重置密码。我说的是“公正”,但是,当然,非法获得他人邮件帐户的访问权限必须是一个困难的过程。但是,并非总是如此



实际上,以上有关入侵莎拉·佩林(Sarah Palin)的Yahoo!的链接有两个目的;首先,它说明了破解(某些)电子邮件帐户的难易程度,其次,它说明了如何恶意使用不良的安全性问题。但是我们稍后再讲。



将密码重置为100%取决于电子邮件的问题是,您要重置的站点帐户的完整性取决于电子邮件帐户的完整性而变为100%。有权访问您电子邮件的任何人都可以访问任何可以通过简单地接收电子邮件来重置的帐户。对于此类帐户,电子邮件是您在线生活的“关键”。



减轻这种风险的一种方法是实施安全性问答模式。不,你以前见过他们的疑问:选择只有你一个问题回答知道答案,然后在您重置密码时,系统会提示您。这增加了人们的信心,即尝试重设的人确实是该帐户的所有者。



回到萨拉·佩林,错误是她的一个或多个安全问题的答案很容易找到。特别是当您是一个如此重要的公众人物时,有关母亲的娘家姓,教育历史或某人过去曾住过的地方的信息并不是所有的秘密。实际上,大多数人都可以找到它。萨拉也是如此:



黑客David Kernell可以通过找到Palin的背景信息(例如她的大学和出生日期),然后使用Yahoo!帐户密码恢复功能来访问Palin的帐户。


这主要是Yahoo!的设计缺陷。 -通过指出这些简单的问题,公司实质上破坏了秘密问题的价值,从而破坏了其系统的保护。当然,重置电子邮件帐户的密码总是比较困难,因为您无法通过向所有者发送电子邮件(没有第二地址)来证明所有权,但是幸运的是,如今没有太多方法可以使用该系统。



回到秘密问题-有一个选项使用户能够创建自己的问题。问题在于结果将是非常明显的问题:



天空是什么颜色?



人们使用安全问题来识别时,使人们处于尴尬境地的问题(例如呼叫中心):



圣诞节那天我和谁一起睡?



还是彻头彻尾的愚蠢问题:



您如何拼写“密码”?



当涉及到安全性问题时,需要将用户从自己的手中救出来!换句话说,秘密问题应该由站点本身确定,甚至更好,它应该询问一系列秘密问题,用户可以从中选择。而且不要只选一个;理想情况下,用户在注册时应选择两个或多个安全问题然后将其用作第二个标识通道。有多个问题可以增加对验证过程的信心,并可以增加随机性(并不总是显示相同的问题),并且在实际用户忘记密码的情况下可以提供一点冗余。



什么是一个好的安全性问题?这受几个因素影响:



  1. 它应该简短-问题应该清楚明确。
  2. 答案必须是具体的-我们不需要一个人可以以不同方式回答的问题
  3. 可能的答案应该有所不同-询问某人最喜欢的颜色会给出一小部分可能的答案
  4. ( , ),
  5. — - ,


碰巧的是,有一个很好的问题网站,叫做GoodSecurityQuestions.com有些问题似乎很好,有些则没有通过上述某些测试,特别是“易于搜索”测试。



让我向您展示在PayPal中如何实现安全性问题,尤其是该网站在识别方面付出了多少努力。在上方,我们看到了一个页面(使用CAPTCHA)来启动该过程,但是在这里,我们显示了您输入电子邮件地址并解决了CAPTCHA之后发生的情况:





结果,用户收到以下字母:





尽管这很正常,但是此重置URL的含义如下:





因此,秘密问题开始发挥作用。实际上,PayPal还允许您通过验证您的信用卡号来重置密码,因此还有许多站点无法访问的附加渠道。我只能在不回答两个安全性问题(或不知道卡号)的情况下更改密码即使有人抓住了我的电子邮件,如果他们不了解我的更多个人信息,他们也将无法重设我的PayPal帐户密码。什么信息?这是贝宝提供的安全性问题选项:





就搜索的便捷性而言,学校和医院的问题可能有点不确定,但是其余的问题还算不错。但是,为了提高安全性,PayPal需要附加标识以更改安全性答案:





PayPal是安全密码重置的一个乌托邦式的很好的例子:它实现了CAPTCHA以减少暴力破解的风险,需要两个秘密问题,然后需要另一种完全不同的身份来更改答案-这是在用户已经登录之后。当然,这是我们贝宝的期望;它是一家处理大量资金的金融机构。这并不意味着每次重设密码都必须遵循这些步骤-在大多数情况下,这是过头的事-但这是安全性很重要的一个很好的例子。



秘密问题系统的便利性在于,如果您没有立即实现它,那么如果资源保护级别需要它,则可以在以后添加它。苹果就是一个很好的例子,它最近才实现了这种机制(写于2012年)开始在iPad上更新应用程序后,我看到了以下请求:





然后,我看到了一个屏幕,可以在其中选择几对秘密问题和答案以及应急电子邮件地址:





至于贝宝(PayPal),问题是预先选择的,其中一些实际上非常好:





三对问题和答案中的每对代表一个单独的一组可能的问题,因此有很多配置帐户的方法。



关于安全性问题的答案要考虑的另一方面是存储。在数据库中查找纯文本所面临的威胁几乎与使用密码时所面临的威胁相同,即,公开数据库会立即揭示其含义,不仅使应用程序面临风险,而且还可能使使用相同安全性问题的完全不同的应用程序面临风险(这又是一个难题)阿萨伊)。一种选择是安全散列(强算法和加密随机盐),但是,与大多数密码存储情况不同,有充分的理由将响应显示为纯文本。典型场景是现场操作员通过电话进行身份验证。当然,在这种情况下,散列也是适用的(操作员可以简单地输入由客户端命名的响应),但是在最坏的情况下,即使是对称加密,秘密答案也必须位于加密存储的某个级别。总结:把秘密当成秘密!



还有秘密问题和答案的最后一个方面-它们更容易受到社会工程学的影响。尝试直接为他人的帐户获取密码是一回事,但是就其受教育程度进行讨论(一个普遍的秘密问题)则完全不同。实际上,您可以与某人就某人的生活的许多方面进行现实的交流,而这可能会构成安全问题,而不会引起怀疑。当然,这个秘密问题的实质是,它与某人的生活经历有关,因此被记住了,而这恰恰是一个问题-人们喜欢谈论他们的生活经历!仅通过选择安全性问题选项,以使它们不太可能被社会工程学淘汰,就几乎无能为力了。



[未完待续。]






广告



VDSina提供每日付款的可靠服务器,每台服务器都连接到500兆位的Internet通道,并受到免费的DDoS攻击保护!






All Articles