WebCrypto:从RSA-OAEP到RSA-PSS的安全转换

时间:2017-12-11 06:39:25

标签: security rsa webcryptoapi

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

当我使用RSA-OAEP生成RSA密钥时,相同的密钥可以用于RSA-PSS,但是没有明确的方法可以使用webcrypto API移动它们。

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

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

    一个。 encrypt - > verify

    decrypt - > sign

  5. 使用正确的算法导入“固定”键

  6. 当密钥不可导出时,这个系统会崩溃,我想这样做是为了增加私钥的安全性(恶意脚本,自我xss等)。

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

1 个答案:

答案 0 :(得分:2)

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

  

以加密方式说,使用相同的RSA密钥对进行签名和加密是安全的,前提是密钥对安全地用于签名并安全地用于加密。

     

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

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

  1. 将RSA密钥生成为可提取,
  2. 将其导出到pcks8或jwk
  3. 将其导入两次,因为不可提取:key1-> RSA-OAEP,key2-> RSA-PSS
  4. 销毁原始和可提取的密钥
  5. 然后,生成的密钥相等且不可提取,原始密钥只能在浏览器内存中管理。

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