密码系统要求个人信件 - 他们存储什么?

时间:2011-11-22 12:33:15

标签: hash passwords banking

某些(特别是银行)密码系统要求您输入密码中的三个(指定)字母才能登录。 这应该是击败键盘记录器,并可能是线程嗅探重放攻击(对于未加密的会话)。

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

此类系统通常存储服务器端以使其工作?

他们是用明文存储密码,还是每个字母的单独哈希,或者是什么?

1 个答案:

答案 0 :(得分:17)

正如您所正确注意的,如果仅使用密码的子字符串进行身份验证,则标准密码哈希方案将不起作用。有许多方法可以实现这样的系统:

以明文形式存储密码:

  • 简单易行。
  • 如果数据库遭到入侵则不安全。
  • 可能不符合要求使用散列或加密密码存储的规定(但使用低级数据库加密可能会解决此问题)。

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

  • 如果加密密钥也受到损害,则不比将其存储在普通文件中更安全。
  • 可以满足明确禁止密码存储的规定。
  • 使用专用的hardware security module或单独的身份验证服务器可以提高安全性,该服务器可以存储密钥并为加密和子字符串验证提供黑盒接口。

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

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

使用k-out-of-n threshold secret sharing

  • 比存储多个哈希需要更少的空间,但不仅仅是以普通方式存储密码或使用可逆加密。
  • 无需解密子字符串验证的密码。
  • 如果数据库遭到破坏,仍然容易受到暴力攻击:任何能够猜出 k 密码字母的人都可以恢复其余部分。 (事实上​​,对于某些实现, k -1个字母可能就足够了。)

最终,如果数据库遭到破坏,所有这些方案都会遭受暴力攻击的弱点。这样做的根本原因在于,在典型密码的三个字母子串中(或者甚至是特别强的密码)中,熵不是很多,因此不需要多次猜测就可以破解。 / p>

哪一种最好?这很难说。如果我 选择其中一种方案,我可能会使用强对称加密(例如AES)进行加密存储,使用单独的服务器或HSM来处理加密和验证。这样,至少,攻击前端服务器的攻击者无法复制数据库并离线攻击它(尽管如果它没有实现有效的速率限制,他们仍然可以对HSM进行暴力攻击)。

但是,我要说只使用部分密码进行身份验证的整个想法存在严重缺陷:除了少数特别受限制的攻击情形外,它并没有真正提供它应有的安全优势(例如一个只能观察一个身份验证事件的窃听者,并且不能一直尝试直到他们遇到同样的挑战),但它通过减少成功身份验证所需的信息量从根本上削弱了安全性。对于部分密码验证应该解决的安全问题,有更好的解决方案,例如TANs