2011年(264)
分类: 系统运维
2011-06-04 08:20:58
网上支付对个人站长放开,是近两年的事。我做过基本上市面上所有第三方支付的网关对接开发,通过对各服务商的接口安全协议进行对比,发现各服务商的纯http协议的接口,所采取的加密和验证方式基本上是一致的。
简单来说,这种加密验证方式,有三个要点。
1、选择要参与加密的字段。凡是不允许修改的字段,都必须参与加密。举例说,一个网上支付接口,参与加密的字段至少应包括:订单号、支付金额、回传地址、商家代码。
2、密钥。如果仅仅是把要传递的字段串起来,做一个md5加密传过去作为验证依据,则会比较容易被伪造。因此我们要加一个只有接口双方知道的干扰元素,先把加密串的内容进行一个简单的混淆,然后再进行md5加密,这样别人就很难伪造验证字符串了。这个作为干扰元素的东西,就是密钥。密钥的使用方式很简单,就像其它字段参与拼串的方式一样,用一个“key=密钥值”的形式拼进去就可以了。
3、md5加密。把选定的字段串起来,按照第二点的方法再拼入密钥,然后进行md5加密。
举个简单的例子吧。
比如,第三方支付接口规定的字段名如下:
order_id – 订单号
v_amount – 支付金额
replay_url – 回传地址
customer_id – 商户号
约定密钥key
拼串如下:
$str = ‘order_id=29102&v_amount=100&replay_url=http://www.domain.com/paycenter/reply.php&customer_id=384894-728-8839&key=ksudyrhjsixi’
32位加密:
$key = md5(strtolower($str),false)
至此加密过程完成,只需要把加密结果加上所需传递的字段,一起用get方式传过去即可。注意,参与加密的字段,除密钥之外,必须都传递过去。
解密的过程,跟加密基本一样。比如,a端把加密信息传给b端。b端会收到各关键参数以及a端发过来的关键参数加密结果。b端的工作就是还原a端的拼串、做MD5加密运算等一系列操作,然后,把运算结果跟传过来的加密结果对比。如果b端的运算结果与a端传过来的运算结果一致,说明参数值未被篡改,就可以放心使用了。
其实,这个加密解密的方式,关键就是双方约定的那个密钥。密钥只有a、b双方知道,那么篡改参数的第三方就拼不出正确的加密结果,在b端就不能获得验证。
该协议可以广泛应用于各类接口,自己的不同系统之间如果需要接口对接,也完全可以借用这种方式。