使用ruby做支付宝的MD5、RSA签名和验签

md5签名验签

支付宝的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签名验签

rsa签名要复杂一些,属于非对称的摘要,有公钥和私钥之分。

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值