客户端与服务端交互或后端开发前后分离,其中接口如何设计最安全?

客户端与服务器交互一般采用http协议来传输数据,如何保证传输数据是正常的(传输过程不被篡改)?传输过程数据不被泄露?

传输数据不会重复提交?

1、签名

解决传输过程不被篡改,可以采用参数签名的方式解决:

1.给app分配对应的key、secret

2.Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: 

    a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong2。 

    b. 将secret加在参数字符串的头部后进行MD5加密 ,加密后的字符串需大写。即得到签名Sign
新api接口代码:

app调用:http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35&参数1=value1&参数2=value2.......

 

2、加密

签名只是解决了数据在传输过程中不被篡改。解决数据泄露问题,还需对传输数据进行加密

加密传输,前后端一定要可解密。使用带key的加解密方式base64即可。前后端使用相同的key进行加解密。

这样同样存在一个问题。web开发,浏览器f12即可看到加密的key。同样客户端app代码有可能被反编译,拿到key。

拿到key后,以上加密方式形同虚设。

可以使用ras非对称加密。生成一套公钥和私钥。公钥放到客户端用于加密。私钥放到服务端用户解密。即使公钥泄露,用公钥解密加密后的数据,是解密不出来的。保障的数据在传输过程中的安全。不会泄露。

3、请求的唯一性:

以上虽然解决了篡改、泄露等问题,但如果不做防护,拿到的加密数据可重复恶意请求。为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。
唯一性的实现:在如上的请求参数中,我们加入时间戳 :timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一,也加入sign算法中进行加密。
新的api接口:
http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35&timestamp=201603261407&参数1=value1&参数2=value2.......
如上,我们通过timestamp时间戳用来验证请求是否过期。这样就算被人拿走完整的请求链接也是无效的。

验证过期总会有时间不一致、有效期内被重复提交的问题。

彻底解决该问题,还需对请求的签名和时间戳在后台进行保存,如果存在签名和时间戳都相同的请求,则该请求不再处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值