我们使用安全硬件 key 在 Angular 客户端内对 E2EE 进行加密/解密。
为此,我们正在使用
CryptoJS.AES.encrypt(data, key).toString();
加密
和
CryptoJS.AES.decrypt(data, key).toString(CryptoJS.enc.Utf8);
解密。
注册硬件 key 后,我们收到公钥凭据,然后我们申请
navigator.credentials.create({ publicKey: publicKeyOptions })
在设备中创建 key 对,以便使用公钥和私钥应用对称加密。
现在,我的计划是保存由数据库中提供的公钥加密的credential.id,我想知道如何在客户端解密数据,以及如何获取其私钥。
如果我们的道路错误,请纠正我们,我们愿意讨论。
最佳答案
我不熟悉 CryptoJS,但是the documentation似乎表明 AES.encrypt
的默认行为是使用带有 PKCS#7 填充的 CBC 模式。然而,这本身并不是一种安全的数据加密方法,因为它不包含任何身份验证。 CBC 模式还要求每条消息都有一个随机 IV,而 CryptoJS 文档并不清楚是否这样做,也不清楚 IV 的存储位置。
如果您解决了 IV 的问题,您可以将 CBC 加密与身份验证方案结合起来,例如使用 HMAC 来身份验证 IV 和密文。然而,这变得有点复杂。
浏览器本身提供an encryption interface 。该接口(interface)支持 AES-GCM,这是一种以合理的方式结合加密和身份验证的模式。您必须为每条消息传递一个唯一的 none,但这比使用 CryptoJS 构建您自己的结构要简单。
因此,我建议要么找到一个构建在 WebCrypto 之上的高级库,要么小心地使用 WebCrypto 中的 AES-GCM 来执行加密。
另一个问题是 WebAuthn 目前不提供任何可用于加密的对称 key 。您提到使用私钥,但 WebAuthn 中的私钥永远不会离开验证器,因此不能用于浏览器中的加密。
有a WebAuthn extension提供适合您目的的对称 key ,但它仍处于实验阶段。您需要下载 Chrome Canary 并设置 chrome://flags/#enable-experimental-web-platform-features 才能访问它。
关于使用 Angular 进行端到端加密的安全硬件 key (titan、yubikey...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75148983/