Web Crypto中SHA-256加密正常SHA-512有时失败的原因
RSA-OAEP加密长度限制:SHA-512与SHA-256的差异解析
这不是Bug,是RSA-OAEP加密算法的固有特性,根源在于OAEP填充机制对哈希算法输出长度的依赖。
核心长度限制公式
RSA-OAEP的最大明文长度由以下公式决定:
最大明文长度 = (密钥位数 / 8) - 2 * 哈希输出字节数 - 2
其中:
- 2048位RSA密钥对应256字节(2048/8)
- SHA-256输出32字节,SHA-512输出64字节
代入计算:
- SHA-256:
256 - 2*32 - 2 = 190字节→ 消息长度≤190字节时可正常加密 - SHA-512:
256 - 2*64 - 2 = 126字节→ 消息超过126字节就会触发加密失败
这就是你观察到的现象:短消息(≤126字节)两种哈希都有效,长消息超过126字节时,SHA-512因超出明文上限失败,而SHA-256还在允许范围内。
你的问题解答
是特性还是Bug?
是特性,符合PKCS#1 v2.2(RSA加密标准)中对OAEP填充的定义,所有遵循该标准的实现都会有这个限制。必须用SHA-256吗?
不需要。如果想继续用SHA-512,有两种方案:- 改用更长的RSA密钥:比如4096位密钥,SHA-512对应的最大明文长度为
512 - 2*64 -2 = 382字节,能支持更长消息 - 采用混合加密方案(推荐):先用AES等对称加密算法加密长消息,再用RSA-OAEP加密AES密钥。这是实际生产环境的常规做法,因为RSA天生不适合加密大体积数据,对称加密效率远高于非对称加密。
- 改用更长的RSA密钥:比如4096位密钥,SHA-512对应的最大明文长度为
官方长度限制标准
来自PKCS#1 v2.2规范,该标准明确了RSA-OAEP的明文长度计算规则,核心就是密钥长度减去两倍哈希输出长度再减去2(OAEP填充的固定开销)。
内容的提问来源于stack exchange,提问作者Toyiff
相关产品推荐
相关产品推荐

