使用WebAuthN与YubiKey在浏览器生成对称加密密钥,该方案是否安全?
这个方案存在多个明确的安全隐患和可用性风险,具体问题如下:
- 核心前提不成立:你假设相同挑战会得到相同签名,但WebAuthn默认使用的ECDSA签名依赖随机数生成,只有支持RFC6979确定性ECDSA的认证器才会输出一致的签名。不同YubiKey固件版本、不同浏览器的WebAuthn实现都可能出现同挑战不同签名的情况,最终会导致你无法解密自己的加密数据。
- 密钥泄露风险高:签名结果会完整返回给网页的JS执行环境,只要当前页面存在XSS漏洞,攻击者不需要接触你的YubiKey就能直接拿到签名值,哈希后即可得到AES密钥,解密所有存储的加密内容。
- 不符合WebAuthn的安全设计:WebAuthn规范要求挑战必须是一次性、高熵的随机值,用来防范重放攻击。你固定使用同一个挑战的用法会带来两个明显风险:一是如果挑战泄露,攻击者只要诱骗你对该挑战完成YubiKey授权(比如伪装成常规的登录验证请求)就能拿到密钥;二是部分浏览器或认证器会拦截重复使用的挑战,直接导致流程失败。
- 数据易永久锁定:WebAuthn的签名是和站点RP ID(域名)强绑定的,如果后续你变更了站点域名、或者把网页保存到本地离线打开,都会因为RP ID不匹配,导致相同YubiKey和相同挑战生成的签名完全不同,你的加密数据会被永久锁定无法解密。
如果要优化这个方案,更合理的做法是使用WebAuthn的hmac-secret扩展,这个扩展的设计目标就是基于认证器生成稳定的对称密钥材料,不需要滥用签名能力,安全性和稳定性都高很多。
内容的提问来源于stack exchange,提问作者ucipass
相关产品推荐
相关产品推荐

