只询问个别字母的密码系统 - 它们存储什么?

12

有些(特别是银行)密码系统要求您输入密码中的三个指定字母才能登录。这旨在防止键盘记录器,可能还包括未加密会话的网线嗅探重放攻击。

显然,使用普通的密码散列算法无法实现这样的方案,因为您需要知道整个密码才能计算出散列值。

这种系统通常在服务器端存储什么信息以使其工作?

它们是以纯文本形式存储密码,还是每个字母的单独哈希值,或者其他什么方式?


4
不一定-这个问题已经在ITSecurity.SE上得到回答:http://security.stackexchange.com/questions/4830/how-do-some-sites-e-g-online-banks-only-ask-for-specific-characters-from-a-pa 。还可以参考http://www.smartarchitects.co.uk/news/9/15/Partial-Passwords---How.html。 - Piskvor left the building
也许只有我这样,但我从来没有见过银行要求我提供三个字母。只需要TAN即可。 - PiTheNumber
@PiTheNumber:不仅仅是你,一些银行也(曾经)这样做;我亲身经历过这种情况。请注意,这是在普及手机之前实施的系统(使得可以使用“TAN”),我不确定那家银行是否仍在使用这个系统。 - Piskvor left the building
1个回答

18

如您所述,常规密码哈希方案无法在仅使用密码子串进行身份验证时起作用。 可以有多种实现此类系统的方法:

以明文形式存储密码:

  • 简单易行。
  • 如果数据库被攻击,则不安全。
  • 可能不符合要求,要求哈希或加密密码存储(但使用低级别的数据库加密可能会规避这种情况)。

存储加密密码,解密以检查:

  • 如果加密密钥也被攻击,则与明文存储相比并不更安全。
  • 可能满足禁止明文存储密码的规定。
  • 通过使用专用 硬件安全模块 或单独的身份验证服务器可以使其更安全,该服务器将存储密钥并提供黑盒接口进行加密和子字符串验证。

存储所有(或足够多)可能子字符串的哈希值:

  • 需要比其他解决方案更多的存储空间。
  • 如果数据库受到攻击,则仍然可以通过暴力破解相对容易地恢复密码,因为每个子字符串都可以单独攻击。

使用 k-out-of-n阈值秘密共享

  • 比存储多个哈希值需要更少的空间,但比明文存储密码或使用可逆加密需要更多的空间。
  • 无需解密密码进行子字符串验证。
  • 如果数据库被攻击者入侵,仍容易受到暴力破解攻击:能够猜测出k个密码字母的任何人都可以恢复其余部分。(实际上,对于某些实现来说,k-1个字母可能已足够。)

最终,如果数据库被攻击者入侵,所有这些方案都容易受到暴力破解攻击的威胁。根本原因在于典型密码(甚至是特别强的密码)的三个字母子串中没有很多熵,因此不需要很多次尝试就可以破解。

哪种方案最好?很难说。如果必须选择其中一种方案,我可能会选择使用强对称加密(如AES)进行加密存储,并使用单独的服务器或HSM处理加密和验证。这样,至少攻击者入侵前端服务器后不能只是复制数据库并在离线状态下攻击它(尽管如果HSM未实施有效的速率限制,他们仍然可以对HSM进行暴力破解攻击)。

然而,我要说的是仅使用部分密码进行身份验证的整个想法是有严重缺陷的:除了在一些特别受限制的攻击场景(例如只能观察一个认证事件且不能不停地尝试直到获取相同挑战的窃听者)之外,它实际上并没有提供所应具备的安全保障效益,而且通过减少成功验证所需的信息量从根本上削弱了安全性。有更好的解决方案,例如TANs,可以解决部分密码身份验证所要解决的安全问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接