WebauthN和Yubiky在浏览器中生成对称加密的密钥.这次黑客攻击安全吗



我知道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(示例(如下:

  1. 使用Web Crypto API生成对称密钥
  2. 然后在navigator.credentials.create({ user: {id: YOUR_KEY } })中将该密钥用作user.id以将该密钥存储在验证器中
  3. 将返回的密钥id/rawId存储在应用程序中的某个位置

要检索密钥,可以通过提供rawId 使用navigator.credentials.get({ publicKey })

相关内容

  • 没有找到相关文章

最新更新