Ruby中OpenSSL 1.1.1f RSA私钥解密未加密数据不抛错咨询
RSA解密行为差异:OpenSSL 1.0.2g vs 1.1.1f
一、OpenSSL 1.1.1f不报错输出乱码的原因
OpenSSL 1.1.0及后续版本为抵御侧信道攻击(比如针对RSA padding的Bleichenbacher攻击),修改了私钥解密时的错误反馈逻辑:
- 你传入的"testing"是未加密明文,完全不符合PKCS#1 v1.5的padding规则(PKCS#1要求数据必须以
0x00 + 0x02 + 至少8个随机非零字节 + 0x00 + 明文开头),padding验证实际已经失败。 - 但新版本不会直接抛出
padding check failed错误,而是继续执行解密运算,输出无意义的乱码。这种模糊处理是为了避免攻击者通过错误信息的差异,推断出padding的正确性,从而发起针对性攻击。
二、OpenSSL 1.0.2g与1.1.1f的核心差异
侧信道防护默认启用:
- 1.0.2g版本中,RSA私钥解密的padding验证失败会直接抛出明确错误,这种行为存在安全漏洞,攻击者可利用错误信息发起攻击。
- 1.1.0及之后版本默认启用侧信道攻击防护,其中就包括对padding错误的模糊处理,不再暴露具体错误类型。
底层API实现重构:
- 1.0.2g使用旧版的
RSA_private_decrypt函数,该函数在padding验证失败时立即终止并返回明确错误。 - 1.1.1f采用重构后的EVP接口(OpenSSL 1.1.0开始统一使用EVP层处理加密操作),EVP接口的RSA解密默认启用错误模糊机制,即使padding验证失败,也会返回看似随机的结果。
- 1.0.2g使用旧版的
错误处理逻辑调整:
- 旧版本中,padding失败会直接设置对应错误码并终止流程;新版本则隐藏错误,让解密流程“正常”结束,返回乱码结果,以此迷惑攻击者。
三、业务层面的验证建议
如果需要在新版本中判断解密是否合法,可以在解密后对结果做业务逻辑校验(比如检查是否包含预期标识字段),或者改用安全性更高的PKCS1_OAEP_PADDING填充方式——OAEP本身抗攻击能力更强,且同样会模糊错误信息,业务侧可通过后续校验确认解密有效性。
内容的提问来源于stack exchange,提问作者user2274074
相关产品推荐
相关产品推荐

