上一篇:一个90后员工猝死的全过程

作者:废柴程序员
链接:https://www.jianshu.com/p/54ae53f17602

背景

我们知道,http 通信存在以下问题:

  • 通信使用明文可能会被窃听

  • 不验证通信方的身份可能遭遇伪装

  • 无法证明报文的完整型,可能已遭篡改

使用 https 可以解决数据安全问题,但是你真的理解 https 吗?

当面试官连续对你发出灵魂追问的时候,你能对答如流吗

  1. 什么是 https,为什么需要 https

  2. https 的连接过程

  3. https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计?内容传输为什么要使用对称机密

  4. https 是绝对安全的吗

  5. https 可以抓包吗

如果你能对答自如,恭喜你,https 你已经掌握得差不多了,足够应付面试了。

什么是 https

简单来说, https 是 http + ssl,对 http 通信内容进行加密,是HTTP的安全版,是使用TLS/SSL加密的HTTP协议

Https的作用:

  1. 内容加密 建立一个信息安全通道,来保证数据传输的安全;

  2. 身份认证 确认网站的真实性

  3. 数据完整性 防止内容被第三方冒充或者篡改

什么是SSL

SSL 由 Netscape 公司于1994年创建,它旨在通过Web创建安全的Internet通信。它是一种标准协议,用于加密浏览器和服务器之间的通信。它允许通过Internet安全轻松地传输账号密码、银行卡、手机号等私密信息。

SSL证书就是遵守SSL协议,由受信任的CA机构颁发的数字证书。

SSL/TLS的工作原理:

需要理解SSL/TLS的工作原理,我们需要掌握加密算法。加密算法有两种:对称加密和非对称加密:

对称加密:通信双方使用相同的密钥进行加密。特点是加密速度快,但是缺点是需要保护好密钥,如果密钥泄露的话,那么加密就会被别人pojie。常见的对称加密有AES,DES算法。

非对称加密:它需要生成两个密钥:公钥(Public Key)和私钥(Private Key)。

公钥顾名思义是公开的,任何人都可以获得,而私钥是私人保管的。相信大多程序员已经对这种算法很熟悉了:我们提交代码到github的时候,就可以使用SSH key:在本地生成私钥和公钥,私钥放在本地.ssh目录中,公钥放在github网站上,这样每次提交代码,不用麻烦的输入用户名和密码了,github会根据网站上存储的公钥来识别我们的身份。

公钥负责加密,私钥负责解密;或者,私钥负责加密,公钥负责解密。这种加密算法安全性更高,但是计算量相比对称加密大很多,加密和解密都很慢。常见的非对称算法有RSA。

https 的连接过程

https 的连接过程大概分为两个阶段,证书验证阶段和数据传输阶段

证书验证阶段

大概分为三个步骤

  1. 浏览器发起请求

  2. 服务器接收到请求之后,会返回证书,包括公钥

  3. 浏览器接收到证书之后,会检验证书是否合法,不合法的话,会弹出告警提示(怎样验证合法,下文会详细解析,这里先忽略)

数据传输阶段

证书验证合法之后

  1. 浏览器会生成一个随机数,

  2. 使用公钥进行加密,发送给服务端

  3. 服务器收到浏览器发来的值,使用私钥进行解密

  4. 解析成功之后,使用对称加密算法进行加密,传输给客户端

之后双方通信就使用第一步生成的随机数进行加密通信。

https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计

从上面我们可以知道,https 加密是采用对称加密和非对称机密一起结合的。

在证书验证阶段,使用非对称加密。
在数据传输阶段,使用对称机密。

这样设计有一个好处,能最大程度得兼顾安全效率。

在证书验证阶段,使用非对称加密,需要公钥和私钥,假如浏览器的公钥泄漏了,我们还是能够确保随机数的安全,因为加密的数据只有用私钥才能解密。这样能最大程度确保随机数的安全。

在内容传输阶段,使用对称机密,可以大大提高加解密的效率。

内容传输为什么要使用对称机密

  1. 对称加密效率比较高

  2. 一对公私钥只能实现单向的加解密。只有服务端保存了私钥。如果使用非对称机密,相当于客户端必须有自己的私钥,这样设计的话,每个客户端都有自己的私钥,这很明显是不合理的,因为私钥是需要申请的。

https 是绝对安全的吗

不是绝对安全的,可以通过中间人攻击。

什么是中间人攻击

中间人攻击是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。

HTTPS 使用了 SSL 加密协议,是一种非常安全的机制,目前并没有方法直接对这个协议进行攻击,一般都是在建立 SSL 连接时,拦截客户端的请求,利用中间人获取到 CA证书、非对称加密的公钥、对称加密的密钥;有了这些条件,就可以对请求和响应进行拦截和篡改。

过程原理:

  1. 本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器

  2. 中间人服务器返回中间人自己的证书

  3. 客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输

  4. 中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密

  5. 中间人以客户端的请求内容再向官方网站发起请求

  6. 因为中间人与服务器的通信过程是合法的,官方网站通过建立的安全通道返回加密后的数据

  7. 中间人凭借与官方网站建立的对称加密算法对内容进行解密

  8. 中间人通过与客户端建立的对称加密算法对官方内容返回的数据进行加密传输

  9. 客户端通过与中间人建立的对称加密算法对返回结果数据进行解密

由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。

https 是如何防止中间人攻击的

https 无法防止中间人攻击,只有做证书固定ssl-pinning 或者 apk中预置证书做自签名验证可以防中间人攻击

浏览器是如何确保CA证书的合法性?
一、证书包含什么信息?

颁发机构信息、公钥、公司信息、域名、有效期、指纹……

二、证书的合法性依据是什么?

首先,权威机构是要有认证的,不是随便一个机构都有资格颁发证书,不然也不叫做权威机构。另外,证书的可信性基于信任制,权威机构需要对其颁发的证书进行信用背书,只要是权威机构生成的证书,我们就认为是合法的。所以权威机构会对申请者的信息进行审核,不同等级的权威机构对审核的要求也不一样,于是证书也分为免费的、便宜的和贵的。

三、浏览器如何验证证书的合法性?

浏览器发起HTTPS请求时,服务器会返回网站的SSL证书,浏览器需要对证书做以下验证:

验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证;
判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证;
判断证书是否被篡改。需要与CA服务器进行校验;
判断证书是否已吊销。通过CRL(Certificate Revocation List 证书注销列表)和 OCSP(Online Certificate Status Protocol 在线证书状态协议)实现,其中 OCSP 可用于第3步中以减少与CA服务器的交互,提高验证效率。
以上任意一步都满足的情况下浏览器才认为证书是合法的。

https 可以抓包吗

HTTPS 的数据是加密的,常规下抓包工具代理请求后抓到的包内容是加密状态,无法直接查看。

但是,我们可以通过抓包工具来抓包。它的原理其实是模拟一个中间人。

通常 HTTPS 抓包工具的使用方法是会生成一个证书,用户需要手动把证书安装到客户端中,然后终端发起的所有请求通过该证书完成与抓包工具的交互,然后抓包工具再转发请求到服务器,最后把服务器返回的结果在控制台输出后再返回给终端,从而完成整个请求的闭环。

有人可能会问了,既然 HTTPS 不能防抓包,那 HTTPS 有什么意义?

HTTPS 可以防止用户在不知情的情况下通信链路被监听,对于主动授信的抓包操作是不提供防护的,因为这个场景用户是已经对风险知情。要防止被抓包,需要采用应用级的安全防护,例如采用私有的对称加密,同时做好移动端的防反编译加固,防止本地算法被pojie。

扩展

如何防止抓包?

对于HTTPS API接口,如何防止抓包呢?既然问题出在证书信任问题上,那么解决方法就是在我们的APP中预置证书。在TLS/SSL握手时,用预置在本地的证书中的公钥校验服务器的数字签名,只有签名通过才能成功握手。由于数字签名是使用私钥生成的,而私钥只掌握在我们手上,中间人无法伪造一个有效的签名,因此攻击失败,无法抓包。

同时,为了防止预置证书被替换,在证书存储上,可以将证书进行加密后进行「嵌入存储」,如嵌入在图片中或一段语音中。这涉及到信息隐写的领域,这个话题我们有空了详细说。

预置证书/公钥更新问题

这样做虽然解决了抓包问题,但是也带来了另外一个问题:我们购买的证书都是有有效期的,到期前需要对证书进行更新。主要有两种方式:

提供预置证书更新接口。在当前证书快过期时,APP请求获取新的预置证书,这过渡时期,两个证书同时有效,直到安全完成证书切换。这种方式有一定的维护成本,且不易测试。
在APP中只预埋公钥,这样只要私钥不变,即使证书更新也不用更新该公钥。但是,这样不太符合周期性更新私钥的安全审计需求。一个折中的方法是,一次性预置多个公钥,只要任意一个公钥验证通过即可。考虑到我们的证书一般购买周期是3-5年,那么3个公钥,可以使用9-15年,同时,我们在此期间还可以发布新版本废弃老公钥,添加新公钥,这样可以使公钥一直更新下去。

小结

开头说到的几个问题,你能对答如流了吗

  • 什么是 https,为什么需要 https

  • https 的连接过程

  • https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计?内容传输为什么要使用对称机密

  • https 是绝对安全的吗

  • https 可以抓包吗

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理和创作的 Java 系列教程非常齐全。

推荐阅读

1、2019 年 9 月全国程序员工资统计,你是什么水平?

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别!

Https 真的安全吗?可以抓包吗?如何防止抓包吗?相关推荐

  1. 面试官系列 - https 真的安全吗,可以抓包吗,如何防止抓包吗

    文章目录 前言 背景 什么是 https 什么是SSL https 的连接过程 证书验证阶段 数据传输阶段 https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计 内容传输为什么要使用 ...

  2. Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包

    抓包的重要性 网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知道从何入手分析,往往是从抓包开始,先弄清楚他与服务器通信的内容,如果一目了然,我们完全可以照搬,自行写一 ...

  3. Android抓包指南: 使用Fiddler抓HTTP/HTTPS包

    本文由encoderlee发表于CSDN博客:https://blog.csdn.net/CharlesSimonyi/article/details/90493122 抓包的重要性 网络抓包,是An ...

  4. fiddler抓包教程,如何抓取HTTPS请求,详细教程

    一.Fiddler是什么? Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle ...

  5. (转载)网络抓包原理及常用抓包工具

    感谢和转载于: https://blog.csdn.net/l61052319940708/article/details/80624900 本文以App作为例子,实际应用不限于App范围. 前言:本 ...

  6. fiddler不能抓取浏览器数据_抓包软件 Fiddler 了解一下?

    学会如何抓包,是爬虫的必备技能,甚至可以说,不会抓包就等同于不会爬虫. 那我们怎样抓包呢?如果直接抓取浏览器上的内容,可以直接使用开发者工具进行抓包,但有个局限,只能抓浏览器的,功能也没有多少.还可以 ...

  7. 关于fi dd ler 手机抓包 网卡地址地址_实测对比Wireshark利用nRF52832抓包和Packet Sniffer抓包体验...

    在蓝牙的开发过程中,使用抓包器对蓝牙模块收发数据进行抓包BLE分析,无疑会极大地提高我们的研发开发效率,同时能帮我们快速地定位问题.对于初学者或者开发者来说,BLE抓包分析能让我们更快地理解蓝牙的工作 ...

  8. 安卓抓包软件_你们要的抓包神器!以及抓包原理

    昨天讲到 农行提固定额度失败原因查看方法! 发现好多卡友对这个抓包很有兴趣,今天就着重讲讲抓包的流程. 先讲讲这个抓包的原理:我们手机里面的银行app和服务器连接,把银行app看成是A,把服务器看成是 ...

  9. 抓包,反抓包,反反抓包

    前言 当年还在学校的时候,就接触到了抓包,当时还在贴吧写了一篇小白文来误导小白(不是.但当时的自己还没接触到逆向,竟然对抓包没有提起兴趣,说到底又是太年轻,不懂事.时至今日,才发现它是安全人员必须要掌 ...

  10. 绕过SSL双向校验抓取Soul App的数据包

    参考了这篇文章:Android抓包总结 - 先知社区 https://xz.aliyun.com/t/6551#toc-10 毫无反编译经验的我,硬着头皮参考这篇文章抓到数据,记录一下抓包过程,全部是 ...

最新文章

  1. Codeforces round 1083
  2. UA MATH571A R语言回归分析实践 多元回归2 医疗费用的决定
  3. 如何使用mysql索引查询_MYSQL索引问题:索引在查询中如何使用?
  4. Springmvc的helloworld实例
  5. 4天学会python_学习python第四天
  6. 第四范式送上2022虎年祝福
  7. mysql utf8 cmd,MySQL Windows下cmd显示中文乱码
  8. SAP Fiori 1.0和2.0的区别
  9. Ubuntu 上不了网
  10. exit(0)与exit(1)、return区别
  11. 为什么DDD是设计微服务的最佳实践
  12. HDU2193-AVL-数据结构-AVL
  13. 解决 Cannot open D:\Program Files\Anaconda3\Scripts\pip-script.py 问题
  14. android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...
  15. sql转化为int类型
  16. 有需要【JavaScript权威指南第七版、JavaScript高级程序设计第四版】的可以私信我哈
  17. 学成在线案例(完整代码)
  18. C语言 - 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序。
  19. 苹果ipad有哪几款_别再乱买了!一篇文章讲清楚不同型号iPad之间的区别
  20. Blockchain:区块链入门课程 -- 什么是区块链?

热门文章

  1. 开源监控系统------Zabbix
  2. 安装QTP10.0 报需要先安装 c++组件
  3. SqlCommandBuilder自动创建dataAdapter数据库操作命令
  4. 楼主,不知道为什么这么流行
  5. Affinity Publisher for Mac(桌面排版神器)中文版
  6. 如何在Mac上访问 USB 驱动器?
  7. 苹果Mac从睡眠模式唤醒后 Wi-Fi 无法连接如何解决?
  8. CAD迷你画图 for mac
  9. 在新款mac上找回经典的开机启动声,一条命令轻松搞定
  10. Mac上的Spotlight搜索都能干什么?