首先引入两个问题:

1.如何防止在向服务器请求或者发送数据时防止被伪造?

2.截取客户端数据并伪造成客户端发给服务器怎么办?

1.客户端与服务器端交互的Token

Token为服务器按照一定加密方式生成的供客户端下次请求时无需带上用户名和密码的令牌。其存在是为了缓解频繁网络请求给服务器带来的压力。

有两种使用方式:(TODO:待考证)

用设备号/设备mac地址作为Token:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。客户端请求时需要带上设备号、mac地址,优点是客户端不需重新登录,只要登录一次以后一直可以使用。

用session值作为Token:当用户登录时,服务器会获取sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可。session过期后,客户端必须重新登录。

使用时,通常会设有refresh_token和access_token,refresh_token的有效期长于access_token。当请求时发现access_token过期了,客户端可以通过refresh_token来获取一个新的access_token,并且refresh_token的有效期也会重新计时。如果refresh_token也过期了,就只能重新登录了。

可以发现,Token的使用减小了客户端请求对服务器的压力,同时也避免了客户端用户密码暴露的风险。但是这对解决文章开头提出的两个问题无济于事,通过抓包或者其它的方式,客户端发出的数据很容易被利用。

2.MITM攻击

中文说法叫中间人攻击,它是一种间接的入侵方式,攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

黑客

DNS欺骗

攻击者通过入侵DNS服务器、控制路由器等方法把受害者要访问的目标机器域名对应的IP解析为攻击者所控制的机器,这样受害者原本要发送给目标机器的数据就发到了攻击者的机器上,这时攻击者就可以监听甚至修改数据,从而收集到大量的信息。

会话劫持

会话劫持就是在一次正常的通信过程中,攻击者作为第三方参与到其中,或者是在数据里加入其他信息,甚至将双方的通信模式暗中改变,即从直接联系变成有攻击者参与的联系。

代理服务器

这种利用代理服务器暗渡陈仓的做法简直天衣无缝,攻击者可以自己写一个带有数据记录功能的代理服务程序,它利用的是人们对代理的无条件信任和贪便宜的想法,使得一个又一个“兔子”自动撞了上来,在享受这顿似乎美味的“胡萝卜”的同时却不知道安全正在逐渐远离自己。

3.https与SSL证书

用过网盾的人都知道,安装驱动进行交易时,它都需要你安装一个该银行的证书,这样才能保证交易的安全。

https

http的连接很简单,是无状态的。https是一个安全版的超文本传输协议,它由SSL+http协议构建,可进行加密传输,身份认证。

采用https的server必须从CA申请一个用于证明服务器用途类型的证书。服务端和客户端之间的所有通讯,都是加密的。第三方即使截获,也没有任何意义。因为他没有密钥。

SSL是Netscape公司所提出的安全保密协议,,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5 以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。

然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用HTTPS协议传输数据的工作效率只有使用HTTP协议传输的十分之一。因此只需对那些涉及机密数据的交互处理使用HTTPS协议即可。

4.Android实现SSL通讯

由于购买受信任机构颁发的证书需要交相对较高的费用,产生了自己给自己颁发的证书–自签名证书,其在手机应用中普及率较高。

由于在android操作系统中自己签署的不能通过验证的,所以安卓应用软件将会抛出错误。因此你需要书写自己的代码来检查你的自己签署的证书(此处开发者缺失在密码学的概念的知识)。

创建自签名证书

1.生成.keystore

前往bouncycastle下载最新jar包,
http://www.bouncycastle.org/download/bcprov-jdk15on-154.jar

输入命令生成.keystore文件

keytool -genkey -alias ssltest -keystore ssltest.keystore -validity 365

当要求你录入 Common name 的时候, 要填你的主机名

随后将密钥(key)从 .keystore 文件导入 .cer 文件

keytool -export -alias ssltest -keystore ssltest.keystore -file ssltest.cer

最后生成.bks文件

keytool -import -alias ssltest -file ssltest.cer -keystore ssltest.bks -storetype BKS -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-154.jar

2.把.keystore文件复制到项目的/res/raw/目录下

3.使用

待更新…

推荐阅读为你的安卓应用实现自签名的 SSL 证书

http://wenku.baidu.com/link?url=sacTUmHr2z_rqyd1wsfjyVIzPrSdLMMaQ_SZAoFN4GYFaR9un91ShhOoaPrv4U2j11qPiIOpS6b5wNhOXokcHqKnrL7GtF3Q94_cVg03uOi