支付宝签名验证机制

支付宝app支付的流程如下(图片来自支付宝开放平台)

支付宝签名验证机制_第1张图片

本文重点讨论支付宝的签名验证机制,即图中的第二步。

支付宝签名采用RSA算法。RSA是一种用非对称加密算法只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。支付宝建议采用2048位秘钥。

简单来说,签名主要包含两个过程:摘要和非对称加密,首先对需要签名的数据做摘要(类似于常见的MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果。

支付宝开放平台目前支持两种签名算法

开放平台签名算法名称 标准签名算法名称 备注
RSA2 SHA256WithRSA (强烈推荐使用),强制要求RSA密钥的长度至少为2048,
RSA SHA1WithRSA 对RSA密钥的长度不限制,推荐使用2048位以上
蚂蚁金服官方的说法是RSA2的安全性要强于RSA,所以建议采用RSA2进行签名。

使用支付宝签名首先要通过签名生成工具生成应用公钥和私钥,将公钥上传至支付宝开放平台,同时平台会生成支付宝公钥,支付宝会在接口返回信息时使用SHA1withRsa进行加密,这个公钥客户端不会用到。

客户端的签名流程如下:

1) 组装待签名字符串 
2) 调用签名函数
a. " 使用各自语言对应的SHA1WithRSA签名函数利用商户私钥对待签名字段进行签名,并进行Base64编码。" --from aliDoc
 (  r:网关为mapi,商户即合作伙伴,利用合作伙伴密钥和partner_id 进行签名)
3) 使用签名
"得到的签名结果也是一个字符串,这个字符串就是sign参数的值,将这个字符串赋值给sign参数并发起请求。"--from aliDoc

验签流程:
1) 组装待验签字符串
2) 调用签名验签函数
“RSA:使用各自语言对应的SHA1WithRSA签名验证函数,传入待验签字段、支付宝公钥、参数sign对应的值(该参数为支付宝返回)进行验签,根据返回结果判定是否验签通过。

参考:https://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103596&docType=1

PS:支付宝目前同时支持旧版和新版两种接口,两种接口分别使用独立的api和公私钥签名,不能混用,旧版的公私钥不能用于新版api,同样,新版的公私钥也不能用于旧版的api。

你可能感兴趣的:(支付宝,rsa,开放平台,安全,支付)