【问题标题】:Security hardware keys(titan, yubikey,...) to End to End Encryption with Angular使用 Angular 进行端到端加密的安全硬件密钥(titan、yubikey 等)
【发布时间】:2023-01-19 03:18:07
【问题描述】:
我们正在使用安全硬件密钥在 Angular 客户端中为 E2EE 加密/解密。
为此,我们正在使用
CryptoJS.AES.encrypt(data, key).toString(); 加密
和
CryptoJS.AES.decrypt(data, key).toString(CryptoJS.enc.Utf8); 解密。
硬件密钥注册后,我们收到公钥凭据,然后我们申请
navigator.credentials.create({ publicKey: publicKeyOptions }) 在设备中创建密钥对,以便使用公钥和私钥应用对称加密。
现在,我的计划是保存由数据库中提供的公钥加密的 credential.id,我想知道如何在客户端解密数据,以及我们如何获得私钥。
如果我们的路径错误,请纠正我们,我们愿意讨论。
【问题讨论】:
标签:
security
webauthn
webcrypto-api
yubikey
【解决方案1】:
我不熟悉 CryptoJS,但 the documentation 似乎暗示 AES.encrypt 的默认行为是使用带有 PKCS#7 填充的 CBC 模式。然而,这并不是一种自行加密数据的安全方法,因为它不包含任何身份验证。 CBC 模式还需要为每条消息分配一个随机 IV,而 CryptoJS 文档并不清楚它是否这样做,也不清楚 IV 存储在哪里。
如果您处理 IV 的问题,您可以将 CBC 加密与身份验证方案结合起来,例如通过使用 HMAC 来验证 IV 和密文。然而,这变得有点复杂。
浏览器本身提供an encryption interface。该接口支持AES-GCM,这是一种将加密和认证合理结合的模式。您必须为每条消息传递唯一的 none,但这比使用 CryptoJS 构建您自己的结构更容易。
因此,我建议要么找到一个构建在 WebCrypto 之上的高级库,要么小心地使用 WebCrypto 的 AES-GCM 来执行加密。
另一个问题是 WebAuthn 目前不提供任何可用于加密的对称密钥。您提到使用私钥,但 WebAuthn 中的私钥永远不会离开身份验证器,因此不能用于浏览器中的加密。
a WebAuthn extension 提供适合您的对称密钥,但它仍处于试验阶段。您需要下载 Chrome Canary 并设置 chrome://flags/#enable-experimental-web-platform-features 才能访问它。