跳到内容

选择和使用密保问题备忘单

简介

警告:根据 NIST SP 800-63 的规定,密保问题不再被认为是可接受的认证因素。账户恢复仅仅是另一种认证方式,因此其强度不应弱于常规认证。参见 SP 800-63B 第 5.1.1.2 节第 4 段验证者在选择记忆型密钥时,不得提示订阅者使用特定类型的信息(例如,“你的第一只宠物的名字是什么?”)

如果您好奇,请查阅微软研究院在 2009 年的这份研究以及 Google 在 2015 年进行的这份研究。随附的安全博客更新包含一份关于密保问题所识别问题的图表。

请注意: 尽管密保问题在安全软件中没有可接受的用途,但本备忘单为旧系统提供了如何选择强密保问题的指导。

选择密保问题

期望的特征

任何向用户提出的用于重置忘记密码的密保问题必须满足以下特征

特征 解释
可记忆 用户必须能够回忆起问题的答案,即使是在创建账户多年之后。
一致性 问题的答案不得随时间变化。
适用性 用户必须能够回答这个问题。
保密性 问题的答案必须难以被攻击者获取。
具体性 答案对用户来说应该清晰明了。

密保问题的类型

密保问题主要分为两种类型。对于用户定义的密保问题,用户必须从列表中选择一个问题,并提供问题的答案。常见的例子是“你最喜欢的颜色是什么?”或“你的第一辆车是什么?”

这些问题易于应用程序实现,因为所需的额外信息在用户首次创建账户时由用户提供。然而,用户通常会为这些问题选择弱答案或易于被发现的答案。

系统定义的密保问题基于已知的用户信息。这种方法避免了要求用户提供特定的密保问题和答案,也防止了他们选择弱信息。然而,它依赖于已经存储了足够的用户信息,并且这些信息难以被攻击者获取。

用户定义的密保问题

不好的问题

应避免任何不具备上述所有特征的问题。下表给出了一些不好的密保问题的例子

问题 问题
你的出生日期是什么时候? 攻击者容易发现。
你的纪念日是什么? 大多数用户只会输入他们的生日。
你最喜欢的电影是什么? 很可能会随时间变化。
你最喜欢的板球队是哪支? 不适用于大多数用户。
你的第一辆车的品牌和型号是什么? 可能的答案范围相当小。
你的昵称是什么? 可以通过浏览社交媒体帖子猜到。

此外,在判断问题好坏时,必须考虑应用程序的上下文。例如,如果一个问题,如“你小学八年级数学老师的姓氏是什么?”,用于学校的虚拟学习环境,就很容易被猜到(因为其他学生可能知道这些信息),但对于一个在线游戏网站来说,它会强得多。

好的问题

许多好的密保问题并不适用于所有用户,因此最好的方法是给用户提供一个密保问题列表供他们选择。这允许您拥有更具体的问题(具有更安全的答案),同时仍为每个用户提供他们可以回答的问题。

以下列表提供了一些好的问题的例子

  • 你申请过但没有入读的大学名称是什么?
  • 你记得就读的第一所学校叫什么名字?
  • 你最难忘的学校实地考察目的地是哪里?
  • 你小学八年级数学老师的姓氏是什么?
  • 你的第一个填充玩具叫什么名字?
  • 你的驾驶教练的名字是什么?

就像密码一样,用户在不同网站之间重复使用恢复问题的风险存在,如果其他网站被入侵,可能会使用户面临风险。因此,拥有独特的密保问题(不太可能在网站之间共享)是有益的。实现这一目标的一个简单方法是根据应用程序类型创建更有针对性的问题。例如,在股票交易平台上,可以使用与财务相关的问题,例如“你第一次拥有股票的公司是哪家?”

允许用户自己编写问题

允许用户自己编写密保问题可能会导致他们选择非常强大且独特的问题,这些问题将非常难以被攻击者猜到。然而,用户也存在选择弱问题的重大风险。在某些情况下,用户甚至可能会将恢复问题设置为提醒其密码的内容——这使得任何猜到其电子邮件地址的人都可以入侵其账户。

因此,通常最好不要允许用户自己编写问题。

限制答案

强制答案的最小长度可以防止用户输入“a”或“123”等字符串作为答案。然而,根据所问的问题,这也可能阻止用户正确回答问题。例如,要求提供名字或姓氏可能会导致两个字母的答案,例如“Li”,而基于颜色的问题可能是四个字母,例如“blue”。

答案也应对照黑名单进行检查,包括

  • 用户名或电子邮件地址。
  • 用户当前密码。
  • 常见字符串,如“123”或“password”。

更新密保问题

如果密保问题不作为主要认证流程的一部分,那么考虑定期(例如在密码过期后更改密码时)提示用户查看其密保问题,并验证他们是否仍然知道答案。这应该给他们一个机会来更新可能已更改的任何答案(尽管理想情况下好的问题不应该出现这种情况),并增加他们在需要恢复账户时记住这些问题的可能性。

系统定义的密保问题

系统定义的密保问题是基于已知的用户信息的。用户的个人详细信息通常被使用,包括全名、地址和出生日期。然而,这些信息很容易被攻击者从社交媒体上获取,因此提供的认证级别非常弱。

可以使用的问卷将根据应用程序以及已存储的用户信息量而大相径庭。在决定哪些信息可用于密保问题时,应考虑以下几个方面:

  • 用户能否记住问题的答案?
  • 攻击者能否轻易从社交媒体或其他来源获取此信息?
  • 答案是否可能对大量用户都相同,或者容易被猜到?

使用密保问题

何时使用密保问题

应用程序通常应使用密码和第二个认证因素(如OTP代码)来认证用户。密码和密保问题的组合不构成MFA,因为两个因素是相同的(即,你知道的东西)。

密保问题绝不应作为认证用户的唯一机制。 然而,当其他更强的因素不可用时,它们可以提供一个有用的额外安全层。常见的使用情况包括:

  • 登录。
  • 重置忘记的密码。
  • 重置丢失的MFA令牌。

认证流程

在MFA不可用时,密保问题可以作为主要认证流程的一部分来补充密码。典型的认证流程如下:

  • 用户输入其用户名和密码。
  • 如果用户名和密码正确,则向用户显示密保问题。
  • 如果答案正确,用户即可登录。

如果密保问题的答案不正确,则应将其计为失败的登录尝试,并增加用户的账户锁定计数器。

忘记密码或丢失MFA令牌流程

如果忘记密码功能没有正确实现,它通常会为攻击者提供枚举用户账户的机制。以下流程通过仅在用户证明其拥有电子邮件地址后才显示密保问题来避免此问题:

  • 用户输入电子邮件地址(并解决CAPTCHA)。
  • 应用程序显示一条通用消息,例如“如果电子邮件地址正确,将向其发送一封电子邮件”。
  • 一封包含随机生成的一次性链接的电子邮件将发送给用户。
  • 用户点击链接。
  • 向用户显示密保问题。
  • 如果答案正确,用户可以输入新密码。

如何使用密保问题

存储答案

密保问题的答案可能包含用户的个人信息,也可能在不同应用程序之间被用户重复使用。因此,它们应与密码同等对待,并使用Bcrypt等安全哈希算法存储。密码存储备忘单包含有关此内容的进一步指导。

比较答案

以不区分大小写的方式比较用户提供的答案与存储的答案,能让用户更容易操作。最简单的方法是在对答案进行哈希存储之前将其转换为小写,然后将用户提供的答案转换为小写再进行比较。

此外,向用户提供一些关于他们应使用的答案输入格式的提示也是有益的。这可以通过输入验证来完成,或者简单地建议用户以特定格式输入其详细信息。例如,当要求提供日期时,指出格式应为“DD/MM/YYYY”将意味着用户无需猜测他们在注册时输入的格式。

更新答案

当用户更新其密保问题答案时,这应被视为应用程序中的敏感操作。因此,应要求用户通过输入其密码(或理想情况下使用MFA)重新进行身份验证,以防止攻击者在暂时获得用户帐户访问权限时更新问题。

多个密保问题

当使用密保问题时,用户可以被问一个问题,也可以同时被问多个问题。这提供了更高的安全保障级别,特别是当问题多样化时,因为攻击者需要获取更多关于目标用户的信息。用户自定义问题和系统定义问题的混合使用对此非常有效。

如果用户被要求从一堆可能的问题中回答一个问题,那么这个问题不应在用户正确回答之前更改。如果允许攻击者尝试回答所有不同的密保问题,这将大大增加他们能够猜测或获取其中一个答案的机会。