You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
1、Perform the RSA encryption for the parameter values with the public key of the WeChat Pay Platform certificate. Use RSAES-PKCS1-v1_5 as the filling scheme.
运行环境
描述你的问题现象
这可能不应该是件公开讨论的事宜,有关应用安全的问题可能需要具有专业知识的人来共同探讨,然而此问题在开源社区有了许多公开讨论,暂且先把问题及可能的解决方案记录于此。
缘由
在例行性更新本地PHP版本的时候,按操作习惯,会
run
一遍测试用例,然而有许久如下测试用例有一条F一直悬而未决:wechatpay-php/tests/Crypto/RsaTest.php
Lines 307 to 321 in 2cabc8a
现状
翻阅了PHP的更新历史及OpenSSL的更新历史,发现如下两条重要更新:
PHP自8.1.0起,使用了OpenSSL的
EVP_PKEY API
,且OpenSSL自3.2.0起,已显式调整EVP_PKEY_decrypt
处理逻辑,默认当填充方式为RSA_PKCS1_PADDING
解密失败时,不再抛异常,代为输出为随机字符串。这即是 "encrypted as OPENSSL_PKCS1_OAEP_PADDING, and decrpted as OPENSSL_PKCS1_PADDING" 用例测试未通过的原因所在。公开的CVE/patch/backport如:
都提到了一点是,
RSAES-PKCS1-v1_5
已不再安全并且容易受到攻击。受影响
目前已知在微信支付海外版,有如下两个接口声明的非对称加密方案为
RSAES-PKCS1-v1_5
:身份信息校验API
Onboard Sub-merchant API
解决方案
服务端
建议微信支付团队,评估影响等级及寻求解决方案。
客户端
本SDK(wechatpay-php)自1.2.1起,提供了
OPENSSL_PKCS1_PADDING
加解密支持,目前客户端暂时未发现使用OPENSSL_PKCS1_PADDING
解密的场景,出于兼容性及安全考虑,需要:\WeChatPay\Crypto\Rsa::decrpt
函数,当使用OPENSSL_PKCS1_PADDING
填充方案时,给予废弃及安全提示,不再推荐使用;OpenSSL>3.2.0
默认行为保持一致,代为输出为随机字符串;WeChatPay\Tests\Crypto\RsaTest::testCrossEncryptDecryptWithDifferentPadding
用例覆盖;The text was updated successfully, but these errors were encountered: