抓包工具能获取 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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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年前 评论

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