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

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 面试官 - https 真的安全吗,可以抓包吗,如何防止抓包吗

前言


面试中,网络(http, https, tcp, udp), jvm, 类加载机制等这些基础的知识点是高频出现的,每个程序员都能说上好多。但不一定说到重点,以及理解背后的原理。


我在面试的过程中也经常被问到,于是总结记录了下来。千万不要小瞧这些基础,有时候,你算法,项目经验都过了,但是基础答得不太好。结果可能会通过,但这肯定会影响你的评级,这是特别吃亏的。所以,不如花点时间背一下,理解一下背后的原理。


举一个简单的例子, https 连接过程是怎样的,使用了了哪种加密方式,可以抓包吗,怎样防止抓包,你是否能够对答如下。


废话不多说,开始进入正文。


背景


我们知道,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的工作原理,我们需要掌握加密算法。加密算法有两种:对称加密和非对称加密:


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


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


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


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


https 的连接过程


ac0204045ef2682ec765be6afc61e739_format,png.png


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


证书验证阶段


大概分为三个步骤


  1. 浏览器发起请求
  2. 服务器接收到请求之后,会返回证书,包括公钥
  3. 浏览器接收到证书之后,会检验证书是否合法,不合法的话,会弹出告警提示(怎样验证合法,下文会详细解析,这里先忽略)


数据传输阶段


证书验证合法之后


  1. 浏览器会生成一个随机数,
  2. 使用公钥进行加密,发送给服务端
  3. 服务器收到浏览器发来的值,使用私钥进行解密
  4. 解析成功之后,使用对称加密算法进行加密,传输给客户端


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


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


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


在证书验证阶段,使用非对称加密。

在数据传输阶段,使用对称机密。


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


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


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


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


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


https 是绝对安全的吗


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


什么是中间人攻击


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


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


dcec8d2e41eb517774153acf1d96e41c_format,png.png


过程原理:


  1. 本地请求被劫持(如DNS劫持等),所有请求均发送到中间人的服务器
  2. 中间人服务器返回中间人自己的证书
  3. 客户端创建随机数,通过中间人证书的公钥对随机数加密后传送给中间人,然后凭随机数构造对称加密对传输内容进行加密传输
  4. 中间人因为拥有客户端的随机数,可以通过对称加密算法进行内容解密
  5. 中间人以客户端的请求内容再向正规网站发起请求
  6. 因为中间人与服务器的通信过程是合法的,正规网站通过建立的安全通道返回加密后的数据
  7. 中间人凭借与正规网站建立的对称加密算法对内容进行解密
  8. 中间人通过与客户端建立的对称加密算法对正规内容返回的数据进行加密传输
  9. 客户端通过与中间人建立的对称加密算法对返回结果数据进行解密
  10. 由于缺少对证书的验证,所以客户端虽然发起的是 HTTPS 请求,但客户端完全不知道自己的网络已被拦截,传输内容被中间人全部窃取。


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


在https中需要证书,证书的作用是为了防止"中间人攻击"的。 如果有个中间人M拦截客户端请求,然后M向客户端提供自己的公钥,M再向服务端请求公钥,作为"中介者" 这样客户端和服务端都不知道,信息已经被拦截获取了。这时候就需要证明服务端的公钥是正确的.


怎么证明呢?


就需要权威第三方机构来公正了.这个第三方机构就是CA. 也就是说CA是专门对公钥进行认证,进行担保的,也就是专门给公钥做担保的担保公司。 全球知名的CA也就100多个,这些CA都是全球都认可的,比如VeriSign、GlobalSign等,国内知名的CA有WoSign。


浏览器是如何确保CA证书的合法性?


一、证书包含什么信息?


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


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


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


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


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


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


以上任意一步都满足的情况下浏览器才认为证书是合法的。


https 可以抓包吗


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


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


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


关于 httpps 抓包的原理可以看这一篇文章。


Android平台HTTPS抓包解决方案及问题分析


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


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


扩展


如何防止抓包?


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


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


关于 Android 中Https 请求如何防止中间人攻击和Charles抓包,可以看一下这一篇文章。


Android中Https请求如何防止中间人攻击和Charles抓包原理


预置证书/公钥更新问题


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


提供预置证书更新接口。在当前证书快过期时,APP请求获取新的预置证书,这过渡时期,两个证书同时有效,直到安全完成证书切换。这种方式有一定的维护成本,且不易测试。

在APP中只预埋公钥,这样只要私钥不变,即使证书更新也不用更新该公钥。但是,这样不太符合周期性更新私钥的安全审计需求。一个折中的方法是,一次性预置多个公钥,只要任意一个公钥验证通过即可。考虑到我们的证书一般购买周期是3-5年,那么3个公钥,可以使用9-15年,同时,我们在此期间还可以发布新版本废弃老公钥,添加新公钥,这样可以使公钥一直更新下去。


小结


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

  1. 什么是 https,为什么需要 https
  2. https 的连接过程
  3. https 的加密方式是怎样的,对称加密和非对称加密,为什么要这样设计?内容传输为什么要使用对称机密
  4. https 是绝对安全的吗
  5. https 可以抓包吗

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
15天前
|
缓存 负载均衡 网络协议
面试:TCP、UDP如何解决丢包问题
TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU
|
1月前
|
存储 缓存 安全
https访问提示不安全,证书密钥验证上如何解决
【10月更文挑战第4天】访问提示不安全,证书密钥验证上如何解决
257 2
|
2月前
|
安全 网络协议 网络安全
在实现HTTPS时,有哪些常见的安全协议
在实现HTTPS时,有哪些常见的安全协议
121 1
|
1月前
|
编解码 JSON 安全
使用search-guard加固安全为https访问
使用search-guard加固安全为https访问
|
3月前
|
Web App开发 存储
常见抓包工具配置抓取HTTPS
常见抓包工具配置抓取HTTPS
|
3月前
|
Java
Java 基础语法-面试题(54-63道)(数组+类+包)
Java 基础语法-面试题(54-63道)(数组+类+包)
45 16
|
3月前
|
Java
【Java集合类面试十二】、HashMap为什么线程不安全?
HashMap在并发环境下执行put操作可能导致循环链表的形成,进而引起死循环,因而它是线程不安全的。
|
3月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
4月前
|
JSON 网络协议 安全
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识
【7月更文挑战第16天】本文介绍了HTTP和HTTPS协议的基本概念与作用,强调了理解HTTP协议对使用抓包工具Fiddler的重要性。HTTP是用于Web浏览器与服务器间信息传输的协议,不加密,易被截取,不适合传输敏感信息。HTTPS是HTTP的安全版,通过SSL/TLS提供加密和服务器身份验证,确保数据安全。HTTP请求包括请求行、请求头、空行和可选的请求主体,响应则有响应行、响应头、空行和响应主体。HTTP协议无状态,而HTTPS解决了安全性问题,但也带来了额外的计算开销。Fiddler作为一个强大的抓包工具,可以帮助开发者和测试人员分析HTTP/HTTPS通信,理解请求和响应的结构。
78 4
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
319 0