<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="接口地址加密 和 API权限设计 保护服务器上的数据安全通信传输" id="card1">
<p> 游客</p><p>
标题:接口地址加密 和 API权限设计 保护服务器上的数据安全通信传输<br/>
正文:<br/>
移动应用中，通过在客户端对访问的url进行加密处理来保护服务器上的数据我认为，保护服务器端的数据，有这么几个关键点：1、不能对使用体验产生影响，这就排除掉了诸如每次接口调用都要求用户输入验证码这样的做法2、接口调用的网络交互需要无规律可循，比如article/1 &amp;ndash;&amp;gt; article/1000 这样的接口就太容易被其他人爬走了3、要严格意义上阻击爬虫，需要每一次网络请求都是不可重放的，这样才能避免其他人通过监听网络交互并重放来爬取数据4、对服务器端编码不产生太大影响，如果要对服务器端伤筋动骨的大改，肯定是要不得的通常，我们会采用一种简单有效的方法：对服务器返回的数据加密来解决，但是，这种做法并没有解决上面所提到的第二点，接口调用的时候url的规律性太强，网络监听一下数据，就很容易找到url地址的规律了，加密的破解也很简单，反编译直接定位到解密函数，拿到密钥。当然，在强大的反编译工程面前，一切努力都是徒劳的，不管你用何种方法，都是可以把中间的逻辑找到并模拟成一个客户端来爬数据的。我下面就提出一个破解更加复杂一些的方法，在客户端产生请求时，对接口url进行RSA加密处理。假设我们本来需要访问 http://api.camnpr.com/articles 这样的一个接口，接口返回json数据。在客户端访问之前，我们先对这个url进行这样的处理：加客户端时间戳：http://api.camnpr.com/1322470148/articles对url的path段进行rsa加密，然后base64：http://api.camnpr.com/TBhIskCgCN+WMK3PftbYzPQFAKvx9sE9OMOxvL00kCBlNiKw2C1Mb7oGcfUepTxauG06NLBNhr5BFtjt7Xu7uwdpUYyVcFRdI37SVyGRCOzaxACOGXGpX5dHZqQJia0icxwWJ+D1RiJqxFWQ++3/IgUOgDzgvQnPIl420bpztB8=我们真实访问的地址就变成了这样一个长长的 url 结构，我们通过rsa算法的padding参数和时间戳，就可以让这个后面长长的bas64串在每次访问的时候都发生变化，同时，我们可以在服务器端把一个小时之内的请求过的串都记下来，并不让再次访问，这样就防止了爬虫的重放请求尝试。在服务器端，<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1937&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1937&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1937&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1937&amp;Page=3">[3]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1937&amp;Page=8">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1937">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1937">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>