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

fad*_*bee 11 passwords hash banking

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

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

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

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

Ilm*_*nen 17

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

将密码存储在plain中:

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

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

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

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

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

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

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

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

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

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