使用 Angular 进行端到端加密的安全硬件 key (titan、yubikey...)

标签 security webauthn webcrypto-api yubikey

我们使用安全硬件 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/

相关文章:

javascript - WebCryptoAPI 是否在浏览器或远程服务器上运行

javascript - Java 签名/验证 key 和 Javascript WebCrypto 验证失败

asp.net - 用户对 Temporary ASP.NET Files 文件夹的写入权限是否会造成任何安全问题?

java - 使用 token (Java) 保护 REST Web 服务

javascript - 跨多个子域的 WebAuthn

android - 如何测试 iOS fido2 BLE 验证器实现?

security - 网址扫描工具

python - 确保在 Django 项目中安全加载 JSON、XML 和 YAML

google-chrome - Yubico/Webauthn 和常驻 key

javascript - Webcrypto AES-CBC 解密 : Operation Error - The operation failed for an operation-specific reason