对于一个新的网站(HTTPS与HSTS+HPKP),我们希望限制登录访问的授权用户的设备。为此,在每个新设备上都生成了一个WebCrypto ECDSA公钥/私钥。服务器存储新设备的公钥并返回设备ID。浏览器保存在一个名为IndexedDB的设备中,私钥(不可提取)和设备ID。
当用户注册他的帐户或想授权一个新设备时,我们会问他这个设备的密码,但是我们不想将他的密码保存在服务器数据库中。
如果我们的DataBase被泄露:
当然,如果在浏览器上删除了IndexedDB,这就要求用户启动一个进程来恢复他的帐户(私人问题,通过电子邮件处理OTP,任何.它不是主题),但这并不是WebCrypto选项所特有的,SRP选项也是如此,因为我们需要检测设备ID并检查它们的签名,以确保它是用户授权的设备。
为了获取信息,我们还在第一次身份验证挑战之后添加了U2F。
在我的具体情况下,您推荐使用SRP挑战还是这个WebCrypto挑战?
发布于 2017-10-28 11:47:48
我提出这个解决方案是为了回答我的问题:
WebCrypto ECDSA密钥确实很有用,但是如果我们按照我的问题(用AES-GCM加密)中所解释的那样使用它,JS就有可能在受害者的浏览器上,在JS控制台中尝试上千个密码,知道它是否是好密码,而不需要与服务器连接。因此,最好不允许在没有服务器交互的情况下尝试密码。这就是为什么我的解决方案是只保留设备的ECDSA密钥,没有可提取的私钥,没有加密,并且对这个设备上的所有用户都是全局的。
SRP是广泛测试和广泛部署的,但是在DB泄漏的情况下,即使很难从蛮力中检索用户密码,也是可能的,因为攻击者拥有SRP盐类和验证器。因此,最好的方法是不要使用用户密码,而是使用一个随机OTP,并在每个成功的连接上更新它。
首先,如果设备没有存储的私钥:
当用户注册或自动更新新设备时:
然后,当用户想要登录时:
服务器可以确认它是良好的OTP、良好的ECDSA设备签名,如果用户有U2F设备,则确认为良好的U2F签名。如果一切正常,服务器将用下一个OTP验证器/salt替换旧的OTP验证器/salt,并返回新的授权JWT。
使用此解决方案,即使DB被泄露,也不可能检索真正的用户密码,只能检索派生的OTP,而且攻击者伪造用户身份是不够的,因为他还需要设备的私钥(和可能的U2F设备)。
对于MITM,他不能读取用户密码或OTP,但可以读取每个OTP验证器/salt。否则,这是不够的,因为他还需要私有设备密钥,并且可能是用户U2F设备。我们还使用HTTPS和HSTS+HPKP来防止MITM攻击。
对于具有受害者设备访问权限的攻击者,他可以使用设备的私钥,并且可以读取盐类和蒙面密钥,但这不应该有助于猜测密码,即使是在客户端受到暴力攻击时也是如此,因为他需要检查OTP对服务器请求是否正常。
此解决方案还在每次成功认证之后每次重新设置一个新的OTP。在DB泄漏的情况下,我们可以向所有用户发送推送通知,只要求他们连接到服务,以重新部署他们的OTP。
因此,该解决方案使用了受人尊敬的协议(SRP、ECDSA设备密钥、U2F验证、OTP、Argon2/PBKDF2 2),并混合使用以提高安全性。
如果某个对等方能够审查此设计以指出任何故障点,这将是非常值得赞赏的:)
https://security.stackexchange.com/questions/172154
复制相似问题