我知道WebauthN是为了执行身份验证而设计的,但我想使用我的Yubiky创建对称加密密钥来加密web浏览器上的内容,而不必依赖后端服务器。
这是我的方法:
- 在断言challenge(
navigator.credentials.get({ publicKey })
(期间,Yubikey签署客户端发送给验证器的质询字符串 - 我提取签名的挑战,用SHA256对其进行散列,并将其用作AES256加密的新对称加密密钥
- 只要相同的挑战字符串被发送到Yubiky,加密密钥将始终相同
为了能够解密web浏览器上的内容。我必须拥有Yubiky和挑战字符串才能进行2因素身份验证。
这种方法有什么问题吗?
为什么不使用Web Crypto API?
此API专为客户端的密码操作而设计,适用于您的用例(客户端加密(。所有最新的浏览器都支持它。
请注意,您可能担心的主要问题是此API不支持硬件设备(智能卡、安全令牌…(
然而,您的Yubiky当然能够生成一个安全的静态密码,您可以将其用作加密/解密数据的主密钥。
也许您可以利用hmac秘密扩展(https://fidoalliance.org/specs/fido-v2.0-rd-20180702/fido-client-to-authenticator-protocol-v2.0-rd-20180702.html#sctn-hmac秘密扩展(?
否。这是一个坏主意,原因如下:
- RS256/ES256不是确定性签名。所以你每次都会得到一个新的随机签名
- 即使你可以,也有类似XSS的东西,这会很快被打破
- 使用上面提到的加密API
- HMAC机密目前保留给平台。您无法通过WebAuthn API访问它
- 在未来,将有一个大型Blob功能,并且largeBlobsKey。。。但这是一个非常漫长的未来
您可以(错误地(使用公钥请求有效负载的user.id
参数,即这里示例中的user
对象:Web验证API(示例(如下:
- 使用Web Crypto API生成对称密钥
- 然后在
navigator.credentials.create({ user: {id: YOUR_KEY } })
中将该密钥用作user.id以将该密钥存储在验证器中 - 将返回的密钥id/rawId存储在应用程序中的某个位置
要检索密钥,可以通过提供rawId 使用navigator.credentials.get({ publicKey })