防篡改问题

作者:梁川
链接:https://www.zhihu.com/question/41641905/answer/92059326
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

大的思路:
尽量在服务器端对数据进行计算、加密、签名、验签,避免将加密/签名算法及加密/签名密钥暴露给外界,降低被攻击的可能性。
针对防篡改的方案,Web端与移动端的方案不完全相同。

一、针对Web应用的一般的方案
1、网络通讯链路层面采用SSL(https)。大部分互联网公司都是采用单向SSL方案(客户端、浏览器认证服务器端证书)。如果对信息要求较高,可以采用双向SSL方案(需要浏览器安装数字证书)。
之所以采用双向SSL要安全些,主要是避免了中间人攻击(MITM)。

2、采用诸如浏览器安全控件等机制,在浏览器端对页面表单提交数据进行加密、防窃听等。此种方案在银行、第三方支付、互联网金融类公司采用较多,但由于需要安装安全控件,成本较高、对诸如电商等公司基本上不可行。

3、商户平台交易订单校验:电商等商户平台的用户将页面表单提交到服务器,服务器必须对订单信息进行计算、校验,包括金额、数量、商品信息、用户身份、session中的信息等。

4、支付请求订单签名:商户平台将支付请求信息提交给支付平台时候,需要同时带上签名信息,一般是用与支付平台约定的商户密钥串及签名算法对订单关键进行进行签名,例如md5(订单id+金额+商户id+商品id+密钥串)。支付平台接收到支付请求后,首先对请求验证签名。
此部分一般有两种方式:a、网页页面重定向方案 b、后台接口调用方案(直连接口)。

5、支付结果验证签名:商户平台在接收到支付平台请求后,一方面要对支付结果的签名进行验签,以避免被伪造支付结果。
此部分一般会采用页面重定向通知+后台通知结合的方式,一般尽量以后台通知结果为准。


二、针对APP等客户端的方案
整体方案思路与Web端类似,但由于APP必须在客户端对请求进行签名、验签,就面临加密算法及加密密钥存储在客户端,被恶意破解攻击的情况。这在android平台尤为突出。
一般采用代码混淆、对核心算法采用动态库、对密钥/证书加密存储等措施。

你可能感兴趣的:(防篡改问题)