抓包工具能获取 https 数据,所以 https 并不安全?

抓包工具能获取 HTTPS 数据,所以 HTTPS 并不安全?

《L03 Laravel 教程 - 实战构架 API 服务器》 的课程中并没有提及关于签名相关的内容。

那么问题来了:

  • 一般的接口都需要有数据加密,做签名啊,不然怎么保证接口安全,中间人攻击怎么办?
  • 即便用了 https ,数据也是可以被抓包和篡改的,你看我用 Charles 就抓了很多知名平台的 https 的包,我还能随意篡改数据。

所以推导过程就变成了 :

Https 可以被抓包工具抓包 =》抓包后就可以读取数据并篡改 =》所以 Https 并不安全,可以被中间人攻击 =》数据必须增加签名才算安全

首先课程中设计的接口用于单页应用的 Web 端,小程序,手机应用,桌面应用等等,目的是完成一套通用的接口,那么针对上面的问题,我们可以讨论一下。

HTTPS 简单介绍

通信安全,肯定需要用 https,那么 https 咋工作的,简单整理一下:

  1. 服务器将自己的证书发送给客户端;
  2. 客户端通过层层 CA 验证证书是真的,从证书里面拿出来服务器的公钥;
  3. 客户端通过服务器公钥将一个随机数发送给服务器;
  4. 服务器通过自己的私钥解密得到随机数,这样客户端和服务器都能通过这个随机出算出一个对称秘钥;
  5. 之后双方通过对称秘钥加密数据进行通信。

简单的过程是这样,通过非对称加密的方式来传输一个对称加密的秘钥,最终通过对称秘钥进行数据加密,这样能保证传输的效率。

这里关键的一步就是服务器发送过来的证书,是通过一个信任的 CA 签名的,所以值得信任。

关于抓包

那么为什么数据可以被抓包呢,比如我么能使用的 Charles,这里很容易混淆第三方中间人和用户本身,可以参考一下知乎的讨论 www.zhihu.com/question/65464646

我们使用抓包工具的第一步就是在你自己设备中信任 Charles 的 CA 证书,在自己的设备中添加了一个 CA,请求的时候,Charles 通过自己的 CA 签名了一个自己的公钥,发送给客户端,客户端就误以为是服务器了,这样之后的流程都会先走到 Charles 然后才会走到目标服务器。

Charles 扮演了一个中间人的角色,而且这个中间人是我们自己设置的。用户本身主动添加中间人,跟中间人攻击完全是两码事,一个正常用户,设备中 CA 无异常,中间人根本参与不进来,即便从网络传输过程中获取了 https 的数据包,也无法解密,获取不了数据,更不要谈篡改了。

客户端签名

很多人会想到,应该在客户端请求之前,对请求的数据进行一次签名,防止一些非法的人随意访问到服务器接口。

首先客户端可以有很多,Web ,小程序,APP,这些个客户端都是可以获取到本地的,利用各种反编译的工具分析客户端的代码,你用什么方式做的签名,我照着做一遍就行了,只要你有接口,我就有一定有办法调用,只是一些时间成本的问题。

所以你会在 Github 上看到各种网易云音乐客户端,微信客户端,知乎日报客户端……

所以如果你是出于防止接口被随意调用,那么只能防备一些小白用户,我个人还是感觉意义不大。

最后

HTTPS 当然也是安全的,不然大家费劲的推广 HTTPS 是为了啥?

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
liyu001989
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9
TimJuly

你把家门钥匙给我了,我打开了你家大门,所以使用钥匙开门是没有安全性可言的?

5年前 评论

老师解释很到位,包只能自己抓,不会受到中间人攻击

5年前 评论

针对这个问题,客户端可以考虑公钥pinning的手段阻断伪造的ssl
https://zhuanlan.zhihu.com/p/36628482
https://zhuanlan.zhihu.com/p/36632385

  • 因为是公钥内置,所以哪怕是letsencrypt三个月的证书续期也不影响(只需保证私钥和公钥不变)
5年前 评论
liyu001989

@XiaohuiLam “需要实现防用户自己抓包的APP采取本方案” 你讨论的是如何不让用户自己抓包。

但是这个问题讨论的是会不会存在 中间人攻击,获取篡改数据

5年前 评论
TimJuly

你把家门钥匙给我了,我打开了你家大门,所以使用钥匙开门是没有安全性可言的?

5年前 评论

文章说的都很有道理,关于对 “请求的数据进行一次签名” 是否必要的说明,也同意。

但是现在很多接口,包括很多大厂的接口,都做了签名。他们是因为没想到这些呢,还是只是流程规范?

5年前 评论
liyu001989

@skyLee 注意区分一下给服务器提供的接口和给客户端提供的接口。

服务端,证明你是你,防止重放攻击,应用层加一层防护等等吧

5年前 评论

穿衣服和裸ben还是有很大区别。但你或许会挑些适合你的衣服,这个问题如解!

5年前 评论

:grinning:

3年前 评论

之前做过一个类似一个积分兑换的APP,是跟真实的钱挂钩的.

1.当时加密方式,禁止了手机端进行代理操作.基本一般的抓包工具抓不到.wireshark这个可以抓到,但是需要分析.

2.基本前后台所有的接口数据,全部都进行了RSA加密,公钥都是特殊情况下获取的,可以随时改 .

3.每次请求参数中还加个随机的共通参数进行校验.

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!