浅谈应用开发中通讯接口的数据保护
很多居心不良的人一直在企图窥测我们宝贵的数据,我们如何来保护我们的数据,实现真正的的安全性呢。
数据加密模型
- 古典加密
古典加密是指加密完全依赖于算法的加密方法。在古代军事等领域广泛应用。现在计算机编码中的base64编码算法可以算是一种比较典型的古典加密算法。 - 现代加密算法
加密算法公开,数据的保密性完全依赖于密码的保密性。在现在计算机领域主要有两大流派:- 对称加密算法
特点:加解密过程使用同一个密钥,密钥泄露则保护数据拾取保护。这类算法有很多。DES、3DES、bu’tongAES、IDEA、RC2等是这类的杰出代表。 - 公钥加密算法
特点:加密解密使用不同的密钥,所以公钥可以发送给很多人,而不会泄露加密数据。典型算法有:RSA、DSA、ECC。
- 对称加密算法
常见的攻击手段
- 窃取
窃取用户有价值的信息。如密码。常见的有键盘钩子、木马病毒。这里我们主要谈论到的就是用网络侦听工具拦截网络数据。 - 篡改
修改通讯数据。比如用户转帐时看到的是转1000元。通过修改数据改为10000元,而用户根本毫无察觉。 - 重放
把用户转帐1000元的通讯包记录下来,反复向服务器发送,导致用用户的钱不断被划走。这类攻击最容易被开发者忽略。 - 伪造
知道了转帐的通讯协议,直接构造一个转帐1000元的数据包,发给服务器。 - 抵赖
用户转了1000元,然后后悔了,告诉说这1000元不是他转的。银行就是通过给用户发一个U盾,来防止用户抵赖。虽然很多人都认为U盾是用来加密数据的。U盾在加密数据中起到了一定的作用。但是防止用户抵赖才是他的根本角色。
常见的窃取数据的手段
- 侦听信道
该方式主要是利用工具拦截网络通讯包。如果通讯数据是明文传输的,则侦听者可以直接获得侦听数据。如果数据是加密的,这侦听途径失败。但是这里要提的是,侦听者可以通过中间者攻击方式拦截到https加密的数据。这里工具有:fiddler、firebug、charlie等。
通过侦听信道,即可实现窃取、篡改、重发、伪造等绝大多数攻击。 - 逆向应用
通过逆向程序发现应用的通讯接口协议。理论上,没有应用可一阻挡一个意志坚定、智力非凡的逆向工作者。不过这类逆向工作者毕竟只是少说,我们通过一些保护手段还是能阻止95%以上蹩脚的逆向工作者。我们的目标不是欺骗福尔摩斯这样的大侦探,而是瞒过雷斯垂德探员即可。
因为逆向应用的门槛较高,所以我们在开发中主要都是防止第一类攻击。第二类攻击主要还是靠一些对应用的加密工具来实现,如代码混淆,应用加壳。
常见的保护手段
- HTTPS/SSL
这是最容易实现的保护手段。现代语言基本都提供了这样的基础设施来支持SSL
Socket。而使用HTTPS在客户端仅需要把地址从http变为https。当然这需要您拥有一个CA签名的证书,并在服务端配置他。当然为了节约成本,您也可以生成自签名证书,通过合理的配置,自签名证书可以达到CA签名证书同样好的效果。
为了防止中间者攻击,你还需要在客户端验证证书。Web程序因为是使用浏览器浏览,所以没办法阻止中间者攻击。https的不足在于,连接建立的握手时间更长,所以在网络socket没有重用保持的情况下,效率会有所降低。 - 自己写算法加密数据
- 内置固定密钥到客户端
虽然可能采用了AES等加密算法,但是因为密钥内置了。所以加密模型退化为古典加密模型, 只要攻击者破译了密码,所有的客户端都不在安全,所有后续的通讯也不在安全。
该方法还存在一个问题,就是形同的明文生成相同的密文。攻击者可以通过伪造明文来破解出密文。 - 每次应用第一次连接时交换密钥
攻击者破译的密码仅一次有效。攻击者需要破解密钥交换协议。这可以把许多侦听类攻击者挡在门外。
该方法对应用的开发难度加大。任何通讯发起前都需要确保密钥已交换完成。现代应用可能有多个通讯发起点,所以确保密钥被正确的交换了至关重要。
- 内置固定密钥到客户端
- 效率至上、数据保密情不是很重要,但是需要阻止第三方发起的模拟请求
并不是所有的接口数据都很重要。对不重要的数据进行加密会降低系统吞吐量和消耗更多的系统计算资源。就像我们看到不是网站所有的页面都启用了Https。但是我们不希望第三方模拟发送请求获取我们的数据、甚至是偷窃用户数据。
这时我们可以考虑不对数据进行加密,改为对通讯数据进行签名。通过对通讯数据混合Salt进行签名。因为攻击者不知道salt的值,仅仅窃听信道是不能模拟出用户请求的。 如果在通讯数据中加入时间因素,还可以防止重放攻击。
因为防抵赖需要对用户身份做特殊认证,大多数应用不具备这一点。一般认为密码登录即为当前用户。加密可以防止大多说攻击。防重放攻击需要特殊实现,一般是加入请求的时间量。
希望以上提到的方法能给您参考和启发,从而开发出安全的应用程序。