基于Web Crypto API的加密与签名:是否需双密钥对?
问题解答
核心结论
你确实需要为密钥包装/加密和签名验证分别生成不同的RSA密钥对,Web Crypto API不支持同一密钥对同时完成这两类操作,这既是API的设计限制,也是密码学的最佳实践要求。
具体原因
API的算法与密钥用途限制
Web Crypto API对密钥的keyUsages属性有严格区分:- 用于加密/密钥包装的RSA-OAEP密钥,生成时需指定
keyUsages为["encrypt", "wrapKey"](公钥)或["decrypt", "unwrapKey"](私钥); - 用于签名/验证的RSA算法(如RSA-PSS、RSASSA-PKCS1-v1_5),密钥的
keyUsages必须设为["sign"](私钥)或["verify"](公钥)。
一个密钥对象无法同时拥有两类用途,API会直接拒绝这种不符合规范的密钥生成或操作请求。
- 用于加密/密钥包装的RSA-OAEP密钥,生成时需指定
密码学实践的安全要求
加密密钥对和签名密钥对的安全目标完全不同:- 加密公钥用于接收保密信息,私钥用于解密;
- 签名私钥用于证明身份和消息不可否认性,公钥用于验证身份。
混用密钥对会带来安全风险,比如签名私钥若被用于加密操作,泄露后不仅会失去签名的不可否认性,还会导致所有用该密钥加密的信息被破解。
实践建议
- 生成RSA-OAEP密钥对:用于对称密钥的包装/解包,以及敏感数据的加密/解密;
- 生成RSA-PSS(推荐)或RSASSA-PKCS1-v1_5密钥对:用于消息签名和身份验证;
- 协作双方交换公钥时,同时交换这两个公钥:对方用你的加密公钥包装对称密钥,用你的签名公钥验证你发送消息的身份。
内容的提问来源于stack exchange,提问作者Eric Anderson
相关产品推荐
相关产品推荐

