PHP与Ruby生成Cashfree API RSA签名Base64结果不一致问题求助
问题根因
你遇到的签名校验失败问题和Base64编码逻辑无关,核心是RSA加密的填充模式不匹配:
- Ruby的
OpenSSL::PKey::RSA#public_encrypt方法默认使用PKCS#1 v1.5填充 - 官方PHP示例中显式指定了
OPENSSL_PKCS1_OAEP_PADDING填充模式,二者加密逻辑不一致,导致生成的密文完全不同
修复方案
直接替换你的签名生成方法即可,显式指定OAEP填充模式和官方逻辑对齐:
def dynamic_signature raw_data = "#{client_id}.#{Time.now.to_i}" filepath = "public_key.pem" public_key = OpenSSL::PKey::RSA.new File.read(filepath) # 显式指定OAEP填充,和官方PHP示例逻辑对齐 encrypted_data = public_key.public_encrypt(raw_data, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING) Base64.strict_encode64(encrypted_data) end
补充说明
你之前测试时拿到的Base64字节对比结果为true,是因为你复制的是已经生成好的PHP端Base64字符串到Ruby中对比,属于相同字符串的字节比对,自然返回true。实际二者加密环节生成的密文本身就存在差异,所以最终输出的Base64签名才会不同。
内容的提问来源于stack exchange,提问作者tambakoo
相关产品推荐
相关产品推荐

