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

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

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

那么问题来了:

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

所以推导过程就变成了 :

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

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

HTTPS 简单介绍

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

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

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

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

关于抓包

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

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

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

用户自己用抓包工具抓包,跟中间人在网络传输中抓包是两件事!

客户端签名

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

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

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

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

最后

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

本帖由系统于 1周前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 6
jake_zou

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

2周前
XiaohuiLam

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

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

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

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

1周前
TimJuly

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

1周前
skyLee

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

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

1周前
liyu001989

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

服务端,证明你是你,防止重放攻击,应用层加一层防护等等吧,但是让客户端做同样的事,只是增加门槛的事情,必要性没那么大

1周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!