某些(特别是银行)密码系统要求您输入密码中的三个(指定)字母才能登录。 这应该是击败键盘记录器,并可能是线程嗅探重放攻击(对于未加密的会话)。
显然,这样的方案无法使用普通密码散列,因为您需要知道整个密码来计算散列。
此类系统通常存储服务器端以使其工作?
他们是用明文存储密码,还是每个字母的单独哈希,或者是什么?
答案 0 :(得分:17)
正如您所正确注意的,如果仅使用密码的子字符串进行身份验证,则标准密码哈希方案将不起作用。有许多方法可以实现这样的系统:
以明文形式存储密码:
存储密码加密,解密以检查:
存储所有(或足够多)可能的子字符串的哈希值:
使用k-out-of-n threshold secret sharing:
最终,如果数据库遭到破坏,所有这些方案都会遭受暴力攻击的弱点。这样做的根本原因在于,在典型密码的三个字母子串中(或者甚至是特别强的密码)中,熵不是很多,因此不需要多次猜测就可以破解。 / p>
哪一种最好?这很难说。如果我 选择其中一种方案,我可能会使用强对称加密(例如AES)进行加密存储,使用单独的服务器或HSM来处理加密和验证。这样,至少,攻击前端服务器的攻击者无法复制数据库并离线攻击它(尽管如果它没有实现有效的速率限制,他们仍然可以对HSM进行暴力攻击)。
但是,我要说只使用部分密码进行身份验证的整个想法存在严重缺陷:除了少数特别受限制的攻击情形外,它并没有真正提供它应有的安全优势(例如一个只能观察一个身份验证事件的窃听者,并且不能一直尝试直到他们遇到同样的挑战),但它通过减少成功身份验证所需的信息量从根本上削弱了安全性。对于部分密码验证应该解决的安全问题,有更好的解决方案,例如TANs。