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

抓包工具能获取 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 是为了啥?

本帖由系统于 2个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
jake666

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

2个月前
XiaohuiLam

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

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

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

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

2个月前
TimJuly

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

2个月前
skyLee

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

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

2个月前
liyu001989

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

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

2个月前

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

1周前

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