支付宝技术文档读书笔记(二)安全规范

      说到安全规范,就不得不提数字签名了。

      数据传输过程中的数据真实性和完整性,我们需要对数据进行数字签名,在接受签名数据之后进行签名校验。

      MD5签名算法

      MD5签名算法算是众多签名算法中比较简单的了。现在假设商户系统与支付宝系统之间使用MD5进行加密。下面是原始数据。

<form 
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。

      第一步是产生待签名数据,首先根据淘宝的签名机制对参数进行排序(这里就不说明排序机制是怎样的了),结果如下。   

_input_charset=utf-8 
body
=
discount
=0 
logistics_fee
=10 
  …………………………………………… 
seller_email
=test@msn.com 
service
=trade_create_by_buyer
show_url
=www.sina.com.cn 
subject
=商品名称

      

      第二步是把参数用“&”连接起来。

_input_charset=utf-8&body=a&discount=0&logistics_fee=
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是一种摘要生成算法,本来是不能用于签名的。但是,通过在待签名数据之后加上一串私密内容(指令发送、接收双发实现规定好的,这里我们成为签名密钥),就可以用于签名了。但是这种算法签名只能起到防数据篡改的功能,不能起到签名防抵赖的功能,因为双发都知道签名密钥。

_input_charset=utf-8&body=a&discount=0&logistics_fee=1
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发起请求,请求参数的顺序不做要求:

https://www.alipay.com/cooperate/gateway.do?sel
ler_email=test%40msn.com
&discount=0&logistics_f
ee=0.01
&notify_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签名算法类似。

各种签名算法的对比 

posted @ 2009-07-02 22:46  Stephen.Huang  阅读(1574)  评论(0编辑  收藏  举报