WebCrypto支持RSA但强制您为可执行的不同操作选择填充方案。 RSA可以执行签名/验证和加密/解密(+密钥包装),但这对于webcrypto API来说是不可能的。
当我使用RSA-OAEP生成RSA密钥时,相同的密钥可以用于RSA-PSS,但是没有明确的方法可以使用webcrypto API移动它们。
我最初的想法是采取这些步骤来转换密钥:
exportKey
jwk
导出密钥
alg
从(例如)RSA-OAEP-512
到PS512
“修复”key_ops
一个。 encrypt
- > verify
湾decrypt
- > sign
使用正确的算法导入“固定”键
当密钥不可导出时,这个系统会崩溃,我想这样做是为了增加私钥的安全性(恶意脚本,自我xss等)。
在算法类型之间“转换”但保留密钥而无法导出的好方法是什么?
答案 0 :(得分:2)
webcrypto API不允许使用密钥进行签名和加密。可能是因为不推荐这种做法。请参阅此回答https://crypto.stackexchange.com/a/12138/42888
以加密方式说,使用相同的RSA密钥对进行签名和加密是安全的,前提是密钥对安全地用于签名并安全地用于加密。
然而,出于不同的原因,这是一个坏主意:密钥管理。签名密钥和加密密钥在备份,访问控制,拒绝等方面有不同的要求。在发生灾难性事件时,签名密钥的后备是销毁它以避免将来伪造,因此签名密钥不需要是广泛支持。相反,加密密钥的后备是保留它来解密现有文档,因此需要可靠地备份。
要回答您的问题,您可以:
RSA-OAEP
,key2-> RSA-PSS
然后,生成的密钥相等且不可提取,原始密钥只能在浏览器内存中管理。
由于您要在浏览器中获得两个密钥,如果公钥的接收者不同,请考虑生成用于签名和加密的不同密钥