为啥说HTTPS加密链接不是绝对安全的
做移动开发几年,就着平台相关说一下HTTPS是什么?引用维基百科的介绍,全称:安全超文本传输协议,即http协议的安全版本,通过TLS/SSL实现加密传输。此处省略一万字介绍,反正我也记不清,大家自己看维基好了 ^_^
HTTPS安全么?https是挺安全的,但并非无懈可击,具体继续看
1.TLS/SSL之下的数据
尽管是https工作在TLS/SSL上的数据是安全的,但是工作在TLS/SSL层之下的数据是不安全的,参考SSL/TLS所在位置,例如抓包软件能够轻松截获你与哪些服务器进行了通信,换句话说,API地址暴露了。
2.中间人攻击开发中难免遇到http抓包的需求,有时遇到https的请求,一般抓包方式就没法正确截获数据了。不过通过伪造证书,https的包也是可以抓的,参见iOS抓包利器Charles 。难道https如此脆弱?既然https能轻易被抓包,还要来干啥?
先看下原理,首先charles伪装成服务端和客户端通信,并同时伪装成客户端与服务器通信,充当中间角色,从而截获数据,如图:
这种方式起效的前提是代码关闭了证书验证:AFNetWorking中的allowInvalidCertificates,所以release时记得打开证书验证,这样伪造的证书就不被接受了。
好了,看起来安全了?等等,allowInvalidCertificates只是实现了拒绝不受信任的证书,注意,重点是信任,如果证书是受到信任的呢?虽然可能性有点小,不过假设有一个攻击者手上拥有一个受信任的证书,首先iPhone信任的证书包括一些预装的证书iOS 8 中可用的受信任根证书的列表,和用户自己安装的证书。那么即使开启了证书allowInvalidCertificates,中间人攻击依然能够发生。这时候就需要开启SSL Ping Mode了AFNetWorking里通过AFURLConnectionOperationSSLPinningMode设置
原理是把证书打包或者公钥打包在APP中,在NSURLConnectionDelegate协议中的connection:willSendRequestForAuthenticationChallenge:中检测证书是否没被篡改。
到此为止,用户的信息基本能保证安全了,但是还是不提倡对接口做签名算法等处理,加大攻击者对接口的攻击难度,下面继续聊。
3.越狱后上面说的方法足够保证用户数据传输的安全了,那么不能抓包是不是就代表了没法截获数据分析出服务器接口了?答案是:NO,只要一台越狱设备,不用什么高深的逆向分析就能轻松搞出接口和参数
a.使用Snoop-it
数据瞬间无处遁形
b.NSURLProtocol利用NSURLProtocol拦截所有NSURLConnection请求。如果不清楚NSURLProtocol是用来干啥的,可以先看下这里
具体原理是利用了Apple提供的NSURLProtocol规则,后面注册的NSURLProtocol会优先被询问(调用canInitWithRequest:),所以只要简单实现个NSURLProtocol子类即可@interface HttpDumpURLProtocol : NSURLProtocol@end@implementation HttpDumpURLProtocol+ (BOOL)canInitWithRequest:(NSURLRequest *)request { NSLog(@"request:%@",request.URL.absoluteString); return NO;}@end
然后如何注入这段代码呢?比较简单的办法是编译成动态库启动APP时直接挂载,或者写个tweek,方法多种多样,能达到目的就行。
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- 为啥到现在你还没有女朋友 ?
- 天赐的声音|33岁张雨绮为啥总离婚?看过这些照片就明白了,都是性感惹得祸