抓包工具能获取 https 数据,所以 https 并不安全?
抓包工具能获取 HTTPS 数据,所以 HTTPS 并不安全?
《L03 Laravel 教程 - 实战构架 API 服务器》 的课程中并没有提及关于签名相关的内容。
那么问题来了:
- 一般的接口都需要有数据加密,做签名啊,不然怎么保证接口安全,中间人攻击怎么办?
- 即便用了 https ,数据也是可以被抓包和篡改的,你看我用 Charles 就抓了很多知名平台的 https 的包,我还能随意篡改数据。
所以推导过程就变成了 :
Https 可以被抓包工具抓包 =》抓包后就可以读取数据并篡改 =》所以 Https 并不安全,可以被中间人攻击 =》数据必须增加签名才算安全
首先课程中设计的接口用于单页应用的 Web 端,小程序,手机应用,桌面应用等等,目的是完成一套通用的接口,那么针对上面的问题,我们可以讨论一下。
HTTPS 简单介绍
通信安全,肯定需要用 https,那么 https 咋工作的,简单整理一下:
- 服务器将自己的证书发送给客户端;
- 客户端通过层层 CA 验证证书是真的,从证书里面拿出来服务器的公钥;
- 客户端通过服务器公钥将一个随机数发送给服务器;
- 服务器通过自己的私钥解密得到随机数,这样客户端和服务器都能通过这个随机出算出一个对称秘钥;
- 之后双方通过对称秘钥加密数据进行通信。
简单的过程是这样,通过非对称加密的方式来传输一个对称加密的秘钥,最终通过对称秘钥进行数据加密,这样能保证传输的效率。
这里关键的一步就是服务器发送过来的证书,是通过一个信任的 CA 签名的,所以值得信任。
关于抓包
那么为什么数据可以被抓包呢,比如我么能使用的 Charles,这里很容易混淆第三方中间人和用户本身,可以参考一下知乎的讨论 www.zhihu.com/question/65464646 。
我们使用抓包工具的第一步就是在你自己设备中信任 Charles 的 CA 证书,在自己的设备中添加了一个 CA,请求的时候,Charles 通过自己的 CA 签名了一个自己的公钥,发送给客户端,客户端就误以为是服务器了,这样之后的流程都会先走到 Charles 然后才会走到目标服务器。
Charles 扮演了一个中间人的角色,而且这个中间人是我们自己设置的。用户本身主动添加中间人,跟中间人攻击完全是两码事,一个正常用户,设备中 CA 无异常,中间人根本参与不进来,即便从网络传输过程中获取了 https 的数据包,也无法解密,获取不了数据,更不要谈篡改了。
客户端签名
很多人会想到,应该在客户端请求之前,对请求的数据进行一次签名,防止一些非法的人随意访问到服务器接口。
首先客户端可以有很多,Web ,小程序,APP,这些个客户端都是可以获取到本地的,利用各种反编译的工具分析客户端的代码,你用什么方式做的签名,我照着做一遍就行了,只要你有接口,我就有一定有办法调用,只是一些时间成本的问题。
所以你会在 Github 上看到各种网易云音乐客户端,微信客户端,知乎日报客户端……
所以如果你是出于防止接口被随意调用,那么只能防备一些小白用户,我个人还是感觉意义不大。
最后
HTTPS 当然也是安全的,不然大家费劲的推广 HTTPS 是为了啥?
本作品采用《CC 协议》,转载必须注明作者和本文链接
高认可度评论:
你把家门钥匙给我了,我打开了你家大门,所以使用钥匙开门是没有安全性可言的?
老师解释很到位,包只能自己抓,不会受到中间人攻击
针对这个问题,客户端可以考虑公钥pinning的手段阻断伪造的ssl
https://zhuanlan.zhihu.com/p/36628482
https://zhuanlan.zhihu.com/p/36632385
@XiaohuiLam “需要实现防用户自己抓包的APP采取本方案” 你讨论的是如何不让用户自己抓包。
但是这个问题讨论的是会不会存在 中间人攻击,获取篡改数据
你把家门钥匙给我了,我打开了你家大门,所以使用钥匙开门是没有安全性可言的?
文章说的都很有道理,关于对 “请求的数据进行一次签名” 是否必要的说明,也同意。
但是现在很多接口,包括很多大厂的接口,都做了签名。他们是因为没想到这些呢,还是只是流程规范?
@skyLee 注意区分一下给服务器提供的接口和给客户端提供的接口。
服务端,证明你是你,防止重放攻击,应用层加一层防护等等吧
穿衣服和裸ben还是有很大区别。但你或许会挑些适合你的衣服,这个问题如解!
:grinning:
之前做过一个类似一个积分兑换的APP,是跟真实的钱挂钩的.
1.当时加密方式,禁止了手机端进行代理操作.基本一般的抓包工具抓不到.wireshark这个可以抓到,但是需要分析.
2.基本前后台所有的接口数据,全部都进行了RSA加密,公钥都是特殊情况下获取的,可以随时改 .
3.每次请求参数中还加个随机的共通参数进行校验.
🤔🤔🤔