开放平台API接口安全性设计——微信支付为例

API接口,相似http://mypay.com/refund/order_id=123&mch_id=123,这个请求我以商户mch_id=123的身份给订单号为order_id=123退款,若是服务器不辩别请求发起者的身份直接作相应的操做,那是及其危险的。php

通常的,在PC端,咱们是经过加密的cookie来作会员的辨识和维持会话的;可是cookie是属于浏览器的本地存储功能。APP端不能用,因此咱们得经过token参数来辨识会员;而这个token该如何处理呢? 延伸开来,接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用。html

通常来讲,在前端对数据作加密或者前面,是不现实的。先后端使用HTTP协议进行交互的时候,因为HTTP报文为明文,因此一般状况下对于比较敏感的信息能够经过在前端加密,而后在后端解密实现"混淆"的效果,避免在传输过程当中敏感信息的泄露(如,密码,证件信息等)。不过前端加密只能保证传输过程当中信息是‘混淆’过的,对于高手来讲,打个debugger,照样能够获取到数据,并不安全,所谓的前端加密只是稍微增长了攻击者的成本,并不能保证真正的安全。即便你说在前端作了RSA公钥加密,也颇有可能被高手获取到公钥,并使用该公钥加密数据后发给服务端,因此务必认为前端的数据是不可靠的,服务端要加以辩别。敏感信息建议上https。前端

因此通常建议上https,敏感信息md5混淆,前端不传输金额字段,而是传递商品id,后端取商品id对应的金额,将金额等参数加签名发送到支付系统。金额能够是明文的。 java

加密

一. Token

token受权机制:用户使用用户名密码登陆后,后台给客户端返回一个token(一般是UUID),并将Token-UserId键值对存储在redis中,之后客户端每次请求带上token,服务端获取到对应的UserId进行操做。若是Token不存在,说明请求无效。 弊端:token能够被抓包获取,没法预防MITM中间人攻击redis

二. Timestamp

用户每次请求都带上当前时间的时间戳timestamp,服务器收到请求后对比时间差,超过必定时长(如5分钟),则认为请求失效。时间戳超时机制是防护DOS攻击的有效手段。算法

三. Sign和RSA算法

将token,timestamp等其余参数以字典序排序,再加上一个客户端私密的惟一id(这种通常作在服务端,前端没法安全保存这个id)或使用私钥签名,将前面的字符串作MD5等加密,做为sign参数传递给服务端。后端

四. 公钥加密,私钥签名

地球上最重要的加密算法:非对称加密的RSA算法。公钥加密的数据,能够用私钥解密;私钥签名(加密)的数据,能够用公钥验签。api

1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,能够实现非对称加密。这种算法用他们三我的的名字命名,叫RSA算法。浏览器

RSA原理是对极大整数作因数分解,如下摘自维基百科。 安全

公钥加密
解密和验签

五. 微信支付的签名方式

暂时比较忙没时间,将于7月29日晚更新。 来更新啦。 微信支付安全规范,能够查看官方文档pay.weixin.qq.com/wiki/doc/ap… 第1点中,其签名算法最重要的一步,是在最后拼接了商户私密的API密钥,而后经过md5生成签名,这时即便金额是明文也是安全的,若是有人获取并修改了金额,可是签名字段他是没法伪造的,由于他没法知道商户的API密钥。固然,除了微信支付的拼接API生成签名的方法,咱们也能够经过java自带的security包进行私钥签名。其中nonce随机字符串,微信支付应该作了校验,能够防止重放攻击,保证一次请求有效,若是nonce在微信支付那边已经存在,说明该请求已执行过,拒绝执行该请求。

API密钥

参考资料

  1. 阮一峰老师的博客-RSA算法原理:www.ruanyifeng.com/blog/2013/0…
  2. 维基百科:zh.wikipedia.org/wiki/RSA%E5…
相关文章
相关标签/搜索