支付宝技术文档读书笔记(二)安全规范
说到安全规范,就不得不提数字签名了。
数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接受签名数据之后进行签名校验。
MD5签名算法
MD5签名算法算是众多签名算法中比较简单的了。现在假设商户系统与支付宝系统之间使用MD5进行加密。下面是原始数据。
name="alipaysubmit"method="post"action="https://www.alipay.com/cooper
ate/gateway.do?_input_charset=utf-8">
<input type=hidden name="body" value="a">
<input type=hidden name="logistics_type" value="EMS">
<input type=hidden name="logistics_fee" value="10">
<input type=hidden name="logistics_payment" value="BUYER_PAY">
<input type=hidden name="out_trade_no" value="2008111517451234">
<input type=hidden name="partner" value="2088002123456782">
<input type=hidden name="payment_type" value="1">
<input type=hidden name="seller_email" value="test@msn.com">
<input type=hidden name="service" value="trade_create_by_buyer">
<input type=hidden name="sign" value="abc123">
<input type=hidden name="sign_type" value="MD5">
<input type=hidden name="subject" value="商品名称">
<input type=hidden name="price" value="0.01">
<input type=hidden name="quantity" value="1">
<input type=hidden name="discount" value="0">
<input type=hidden name="show_url" value="http://www.alipay.com">
<input type=hidden name="return_url" value="http://www.alipay.com ">
签名密钥sign=abc123,签名类型sign_type=MD5。
第一步是产生待签名数据,首先根据淘宝的签名机制对参数进行排序(这里就不说明排序机制是怎样的了),结果如下。
body=a
discount=0
logistics_fee=10
……………………………………………
seller_email=test@msn.com
service=trade_create_by_buyer
show_url=www.sina.com.cn
subject=商品名称
第二步是把参数用“&”连接起来。
10&logistics_payment=SELLER_PAY&logistics_type=EMS&ou
t_trade_no=2008111517451234&partner=2088002123456782&
payment_type=1&price=0.01&quantity=1&return_url=http:
//www.alipay.com&seller_email=test@msn.com&service=tr
ade_create_by_buyer&show_url=www.sina.com.cn&subject=
商品名称
第三步是再最后加上签名密钥。MD5是一种摘要生成算法,本来是不能用于签名的。但是,通过在待签名数据之后加上一串私密内容(指令发送、接收双发实现规定好的,这里我们成为签名密钥),就可以用于签名了。但是这种算法签名只能起到防数据篡改的功能,不能起到签名防抵赖的功能,因为双发都知道签名密钥。
0&logistics_payment=SELLER_PAY&logistics_type=EMS&out_
trade_no=2008111517451234&partner=2088002123456782&pay
ment_type=1&price=0.01&quantity=1&return_url=http://ww
w.alipay.com&seller_email=test@msn.com&service=trade_c
reate_by_buyer&show_url=www.sina.com.cn&subject= 商品名
称 abc123
根据请求参数sign_type来判断采用那种加密算法(这里sign_type=MD5),最终计算出来sign=4b04730e2e8a0a034fa66c509030f8af。
根据请求/响应交互模式处理流程的支付宝系统服务接入URL,我们按照以下URL发起请求,请求参数的顺序不做要求:
ler_email=test%40msn.com&discount=0&logistics_f
ee=0.01¬ify_url=http%3A%2F%2Flocalhost%3A808
8%2Fjsp_shi_gbk%2Falipay_notify.jsp&payment_typ
e=1&service=trade_create_by_buyer&partner=20880
02509209142&_input_charset=utf-8&logistics_type
=EMS&price=0.01&out_trade_no=20081118082127&sub
ject=%E5%95%86%E5%93%81%E5%90%8D%E7%A7%B0&logis
tics_payment=SELLER_PAY&quantity=1&body=a&retur
n_url=http%3A%2F%2Flocalhost%3A8088%2Fjsp_shi_g
bk%2Falipay_return.jsp&show_url=www.sina.com&sig
n=4b04730e2e8a0a034fa66c509030f8af&sign_type=MD5
支付宝系统接收到请求后,会根据上面的步骤生成新的sign,通过比较新旧两个sign就可以知道数据是否被篡改过。同理,商户系统接收到支付宝系统的返回值后,也通过重新计算和对比sign的值就知道数据是否真实可靠。
DSA签名算法
DSA是一种非对称的签名算法,即签名密钥(私钥)与验签名密钥(公钥)是不一样的。私钥用于签名,公钥用于验证签名。使用这种算法签名在起到防数据篡改功能的同时,还可以起到防抵赖的作用,因为私钥只有签名者知道。
商家系统发送请求时,使用自己的密钥对待签名数据进行DSA签名,支付宝系统使用商户的公钥进行校验;支付宝系统返回数据时,使用支付宝的私钥对待签名数据进行DSA签名,商户使用支付宝的公钥进行校验。
RSA签名算法
RSA也是一种非对称算法,同时它还是一种加密算法,使用方法跟DSA签名算法类似。
各种签名算法的对比