iOS上如何防止他人抓包获取信息

相比开发时都用charles抓包,调试,查看数据,结果有一次偶然的机会发现有些安卓的App是无法被抓取的,参考点我跳转 ,想必宇宙最强iOS应该也有这个功能吧,可是找了好久,

NSURLSessionConfiguration.connectionProxyDictionary
怎么配置都不行,还是可以抓到包。但是在模拟器上mac电脑上就抓不到包了。
因为里面的好多key只支持mac不支持iOS?这可如何是好。
我就是有强迫症希望别人开了代理,我们也能正常请求,但是不被抓包。

其他解决方案
1.发现有网络代理,就不请求,直接报错?
2.发现证书是charles的root证书,服务端拒绝访问?

阅读 12.9k
7 个回答

https + 公钥认证。
如果使用 AFNetworking,可以这样:

AFHTTPSessionManager *manager = ...;
NSString *resPath = [[NSBundle mainBundle] pathForResource:@"你的公钥文件" ofType:@"der"];
NSData *data = [[NSFileManager defaultManager] contentsAtPath:resPath];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey
                                            withPinnedCertificates:[NSSet setWithObjects:data, nil]];
manager.securityPolicy = policy;

NSURLSessionConfiguration的connectionProxyDictionary属性设置一个空的Dictionary(不能是nil)就可以不走系统网络设置的代理,从而绕过Charles之类的软件抓包

没有办法
`除非使用私有方法,否则,你无法通过自己的 app 在 iOS 查看 or 设置 proxy 或者 certificate。


更新:

可以尝试 @rickytan 或者 @jaykon 提供的方法。

  1. 使用RSA或者私有加密协议,传输的都是明文,服务端再解密,不过这样,基本过不了审核
  2. 服务端使用双向证书认证,客户端使用服务端的公钥进行请求,这样服务端可以验证后请求来源证书是不是合法的,不过依旧还是那句话,可能过不了审核

好像有个验证https证书的,判断证书不一致就不会走代理了。。http的话就没办法了好像

安卓的示例只是没走代理,如果是HTTP,理论上还是能被抓包的;

不是说走 HTTPS 可以防止被抓包吗(header 中信息除外)。

SSL Pinning

防抓包,慎用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题