2

WebCrypto 支持 RSA,但强制您为可以执行的不同操作选择填充方案。RSA 可以同时执行签名/验证和加密/解密(+密钥包装),但这对于 webcrypto API 来说不太可能。

当我使用 RSA-OAEP 生成 RSA 密钥时,相同的密钥可以用于 RSA-PSS,但是没有明确的方法可以绕过那些使用 webcrypto API 的密钥。

我最初的想法是采取这些步骤来转换密钥:

  1. exportKey使用with导出密钥jwk
  2. “修复”alg从(例如)RSA-OAEP-512PS512
  3. “使固定”key_ops

    一个。encrypt->verify

    湾。decrypt->sign

  4. 使用正确的算法导入“固定”密钥

当密钥不可导出时,该系统会崩溃,我想这样做是为了提高私钥的安全性(恶意脚本、self-xss 等)。

在算法类型之间“转换”但保留密钥而无法导出的好方法是什么?

4

1 回答 1

3

webcrypto API 不允许使用密钥进行签名和加密。可能是因为不推荐这种做法。请参阅此答案https://crypto.stackexchange.com/a/12138/42888

从密码学上讲,使用相同的 RSA 密钥对进行签名和加密是安全的,前提是该密钥对安全地用于签名并安全地用于加密。

然而,这是一个坏主意,原因不同:密钥管理。签名密钥和加密密钥在备份、访问控制、否认等方面有不同的要求。签名密钥在发生灾难性事件时的回退是销毁它以避免将来伪造,因此不需要签名密钥广泛备份。相反,加密密钥的回退是保留它以解密现有文档,因此需要可靠地备份它。

要回答您的问题,您可以:

  1. 生成可提取的 RSA 密钥,
  2. 将其导出到 pcks8 或 jwk
  3. 将其导入两次不可提取: key1-> RSA-OAEP, key2->RSA-PSS
  4. 销毁原始和可提取的密钥

然后,生成的密钥相等且不可提取,并且原始密钥仅在浏览器内存中进行管理。

由于您将在浏览器中获取两个密钥,如果公钥的接收者不同,请考虑生成不同的密钥用于签名和加密

于 2017-12-11T16:28:39.263 回答