支付宝的md5签名比较简单,就是拿到支付宝生成的key,加在原始字符串后面,然后一起做个md5运算就生成了需要的sign了,然后支付宝接收到请求,按照文档中同样的规则组装成一个字符串,末尾加上密钥作md5运算,与提交的sign一致,则验签通过。
示例ruby代码:
# md5签名
def md5_sign(data,key)
return OpenSSL::Digest::MD5.hexdigest(data+key)
end
# md5验签
def md5_verify(data,sign,key)
return true if sign.eql?OpenSSL::Digest::MD5.hexdigest(data+key)
return false
end
rsa签名要复杂一些,属于非对称的摘要,有公钥和私钥之分。
私钥签名,公钥验签,私钥自己保存,公钥给对方保存。
公钥和私钥是一对,支付宝生成一对,商户生成一对。然后交换密钥(商户把支付宝公钥配置进商户系统,商户将商户公钥上传到支付宝网站)
支付宝使用的1024位的公私钥,具体私钥生成,可以参考OpenSSL的生成命令。
ruby使用的是原始私钥,java使用的是pkcs8格式的私钥
# rsa签名,文本内容和私钥路径
def rsa_sign(data,private_key_path)
private_key = File.read(private_key_path)
pri = OpenSSL::PKey::RSA.new(private_key)
sign = pri.sign('sha1', data.force_encoding("utf-8"))
# signature = CGI.escape(Base64.encode64(sign))
signature = Base64.encode64(sign)
# signature = signature.delete("\n","\r")
signature = signature.delete("\n").delete("\r")
return signature
end
# rsa验签,文本内容和签名内容,公钥路径
def rsa_verify(data,sign,public_key_path)
public_key = File.read(public_key_path)
pub = OpenSSL::PKey::RSA.new public_key
digester = OpenSSL::Digest::SHA1.new
sign = Base64.decode64(sign)
return pub.verify(digester, sign, data)
end
# rsa签名验签测试
def test_rsa
data = "123"
puts rsa_sign(data,'rsa_private_key.pem')
sign= "KrXGYocurl3wl6w96dkr906lE1RErlQS2T5zalFIALR6Re78qCQlihIN+iXDyQK6OKc8sQlWUgdARslL0n1WFGM36OWZfhb2dG4mpFaKE3oq88JSrxTR0uAQrR/m13qe5QxpN30gCsrNlAqSlUER8TS8cfI9eWtkTQqz6TWaGio="
puts rsa_verify(data,sign,'rsa_public_key.pem')
end