写在开始前:如有不准确的地方希望大家提出,文章可以改知识不能错。
在写这篇文章之前做了一个移动App项目,项目开发结束后找来一个第三方安全检测部门进行安全检测,高危漏洞不少,其中包括“中间人攻击”。
中间人攻击
来自度娘的一波科普 https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/1739730?fr=aladdin
做个简单的比喻,就是A通过一个传送带给B一个面包,在A与B不知情的情况下C把传送带分成了两条一条A-C,一条C-B,这时候C就知道了A与B之间传送的是什么,而且还可以在面包上咬一口或者在面包里塞点儿辣椒。
成功侵入条件
侵占通讯网络,得到明文数据。
解决方案
因为无法控制用户使用App时所在的网络所以放弃网络侵占防御。只解决明文数据传输的问题,定制一个数据加密方案,让数据传输变得安全。
3DES加密进行传输数据加密
为什么选择3DES算法进行传输数据加密最主要的原因就是效率,因为传输数据加密与解密操作是在每次交互时发生,服务器与App双端都要进行一次加密解密操作的,加密算法的效率是需要考虑的一个主要问题。
关于3DES度娘的科普
https://baike.baidu.com/item/3DES/6368161?fr=aladdin
由于3DES是对称加密算法,所以双端采用相同的加密Key对数据进行加密与解密操作,Key被截获3DES加密算法就会被破解。
Key处理策略
A:定义一个Key分别存储在App端和Server端,这样做一方面是App在被破壳反编译后攻击者就会得到Key的内容。另一方面固定不变的加密Key采用暴力破解进行破解只是时间问题。
B:App每次启动时创建一个动态的加密Key,这样做解决了本地存储Key与固定Key长时间使用问题,但是又出现了一个新问题,双端协商Key的过程如何保证安全性。
采用DH算法进行加密Key生成
来自度娘的科普
https://baike.baidu.com/item/Diffie-Hellman/9827194?fr=aladdin
双端DH交换
在上图可以看出,A-P,A-G,A-Y,B-Y是DH交换中的关键数据,需要一个加密算法让数据传输变得安全。
RSA算法度娘的科普
https://baike.baidu.com/item/RSA%E7%AE%97%E6%B3%95/263310?fr=aladdin
使用RSA算法对DH交换过程中的数据进行加密,即便App被破壳攻击者得到PK,由于无法得到SK,攻击者无法对数据进行解密和更改再加密操作。无法在加密Key协商过程中进行中间人攻击,这就保证中间人得不到最终数据传输时使用的加密Key。
写到这里基本解决了中间人攻击问题,但是又有了下一个问题,为毛不使用HTTPS协议呢?