聊一聊 TLS/SSL

tls,ssl · 浏览次数 : 344

小编点评

**TLS/SSL 协议简介** TLS/SSL 协议是一种用于加密通信的协议,它可以确保通信过程的安全性,防止恶意攻击者截获或篡改通信数据。 **TLS/SSL 的工作原理** TLS/SSL 协议使用两个密钥对数据加密:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。当浏览器和服务器使用不同的密钥对进行加密通信时,它们会生成一个会话密钥,用于后续的对称加密通信中。 **TLS/SSL 的安全性** TLS/SSL 协议通过以下几种技术确保通信过程的安全性: - **非对称加密:**在加密通信之前,浏览器和服务器使用不同的密钥对加密数据。这确保任何恶意攻击者试图截获或篡改通信数据,都无法解密数据。 - **哈希函数:**在加密和解密数据之前,浏览器使用哈希函数来计算数据摘要,确保数据完整性。 - **数字证书:**浏览器使用数字证书来验证证书颁发机构的认证度和证书的有效性。 **TLS/SSL 的应用** TLS/SSL 协议在各种应用程序中使用,包括: - 网易访问网站 - 支付平台在线支付 - 电子邮件发送 - 聊天软件通信 **结论** TLS/SSL 协议是确保通信过程安全的重要技术,可以防止恶意攻击者截获或篡改通信数据。使用 TLS/SSL 协议可以确保通信数据的完整性和安全性。

正文

哈喽大家好,我是咸鱼

当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头
image
这意味着我们正在使用 TLS/SSL 协议进行安全通信。虽然它可能看起来只是一个小小的锁图标和一个 “https” ,但实际上,这个协议在保护我们的在线隐私和安全方面扮演着至关重要的角色

那今天咸鱼就跟大家聊一聊 TLS/SSL 相关的一些知识

阅读文章之前,需要知道:

TLS(Transport Layer Security)和 SSL(Secure Sockets Layer)都是用于加密通信的协议

TLS 是 SSL 的升级版本,它修复了 SSL 中存在的一些安全漏洞,并提供了更高级的安全性

中间人攻击

一天中午,咸鱼在星巴克里打算上网冲浪一下,这时候有一个很坏很坏的人走进了星巴克

坏人建了一个跟星巴克 WI-FI 同名的接入点,当咸鱼上网的时候,稍微不注意连接到了坏人伪造的那个假的星巴克 WI-FI,这就导致咸鱼任何流量请求都在坏人的监控之下

又或者坏人跟咸鱼都连上了星巴克 WI-FI ,然后他通过伪造 DHCP 服务来告诉咸鱼的设备:【我就是网关,要上网的话,让我帮你转发就可以了】

当咸鱼要登陆银行进行转账开始访问银行网站的时候,坏人截获了咸鱼这个请求,并向银行的网站发送一个伪装请求,假装是咸鱼在请求

银行以为这个请求来自于咸鱼,于是返回响应;坏人把这个响应截获了,然后转发到咸鱼的设备上

咸鱼的设备认为这个响应来自于银行,于是咸鱼看到的是一个正常的银行网站登陆界面,便乖乖地输入了登录信息(用户名密码等)

坏人再次截获这些信息,然后将其发送给真正的银行网站,这时候坏人已经拿到了咸鱼的登录信息

同时,他也继续截获所有咸鱼与银行之间的通信,以便访问咸鱼的银行账户或者进行其他恶意活动

image
这便是中间人攻击(Man-in-the-Middle Attack,简称 MITM 攻击)

中间人攻击是一种计算机安全威胁,攻击者插入自己在通信的两端,窃取或篡改信息

这种攻击可以在不被察觉的情况下进行,因为通信的两方认为他们正在直接相互通信,而实际上信息经过了攻击者的处理

如何避免遭受中间人攻击呢?聪明的小伙伴很快就想到了——通过 HTTPS 来进行加密通信!这样即使信息被截获,坏人也无法轻易解密

TLS/SSL

非对称加密

HTTPS 通过 TLS/SSL 来实现加密传输数据,保证数据在传输的过程中中间人无法解密,这样就保证了数据的安全性

加密数据不是什么难题,通信的时候双方用密钥对数据加密就行了

但如果大家跟银行进行加密通信的时候用的密钥都是一样的,中间人依旧能够使用这个密钥去伪造网站然后截获你的加密数据。这样的话要不要密钥都没啥区别,甚至不还如不要密钥呢

所以最好的情况就是:我跟银行通信的时候协商好用什么密钥——用 A 密钥对数据加密(公钥),然后用 B 密钥对数据解密(私钥),而且:

  1. A 密钥加密的数据只能 B 密钥解密
  2. 这个 B 密钥只能我一个人拥有,别人是拿不到的

B 密钥的唯一性,既保证了数据的安全(A 密钥加密的数据只能 B 密钥解密),又能证明我是我(即 B 密钥只能我一个人拥有)

这便是非对称加密技术

非对称加密有两个秘钥,一个是公钥,一个是私钥:

  • 公钥会放在互联网上公开;私钥被自己保存,不能对外泄露
  • 公钥加密的数据,只有对应的私钥才可以解密
  • 只有你有私钥,我才相信你是你

举个例子,首先咸鱼和银行把自己的公钥互相给对方,在通信的时候,咸鱼用银行给的公钥去加密数据并发送给银行,银行拿到之后用自己的私钥解密数据

同理,银行用咸鱼提供的公钥进行数据加密,然后咸鱼拿到加密数据之后用自己的私钥进行解密
image
TLS/SSL 握手

我们在与银行通信的时候使用 TLS/SSL 加密传输数据,会有经过两个阶段:

  1. TLS/SSL 握手阶段:用于建立安全的连接通道(非对称加密)
  2. 数据传输阶段:通道建立好之后,开始传输数据(对称加密)

即在 TLS/SSL 握手阶段使用的是非对称加密技术,数据传输阶段用的是对称加密技术

首先网站会公开自己的公钥(也就是大家常说的“证书”,网站的公钥是通过数字证书公开的)

当浏览器连接到网站时,会先去下载网站的证书

那这里会有一个问题:既然网站的证书是公开的,阿猫阿狗也能下载。那浏览器如何知道这个证书的拥有者即对方就是该网站呢?

聪明的小伙伴肯定会想到:只要能证明对方有私钥就行了!也就是说浏览器用证书(即公钥)加密一个数据,然后发送给对方;如果对方有私钥,那就能解密这个数据并返回给浏览器,那浏览器就知道对方身份了

浏览器会验证证书的有效性(包括验证服务器的身份,检查证书是否过期,是否由受信任的证书颁发机构(CA)签发)

以此来确保正在与合法的网站通信

所以浏览器会生成一个随机数(client random),并使用服务器的公钥对其进行加密,然后将其发送回服务器

服务器使用自己的私钥解密此数据,并使用浏览器的公钥对另一个随机数(server random)进行加密并发送回客户端

这两个随机数将用于生成会话密钥,用于之后的对称加密通信

具体TLS/SSL 握手阶段请看:TLS 详解握手流程 - 掘金 (juejin.cn)

证书颁发机构 CA

前面我们提到:浏览器会去验证证书的有效性,其中包括验证证书是否由受信任的证书颁发机构(CA)签发

这个证书颁发机构(CA,Certification Authority)是一个权威的第三方机构,它的存在是为了告诉浏览器:有我做担保,你们只管信我;只有网站的拥有者,才能拥有网站的证书

即 CA 在这个过程中充当了一个【担保人】的角色,当浏览器拿到网站的证书的时候,会去问 CA :“这个证书是否合法?”

然后 CA 说:“这个证书是合法的!”,浏览器才会信任这个网站

网站需要向 CA 申请证书,CA 要对自己颁发的证书负责

最后

以上就是关于中间人攻击、TLS/SSL、CA 大致的原理和内容,这篇文章花了我较大精力去写,若是文中有不对的地方,欢迎指出

与聊一聊 TLS/SSL 相似的内容:

聊一聊 TLS/SSL

哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信。虽然它可能看起来只是一个小小的锁图标和一个 “https” ,但实际上,这个协议在保护我们的在线隐私和安全方面扮演着至关重

聊一聊领域驱动与贫血模型

写在前面 前段时间跟领导讨论技术债概念时不可避免地提到了代码的质量,而影响代码质量的因素向来都不是单一的,诸如项目因素、管理因素、技术选型、人员素质等等,因为是技术债务,自然就从技术角度来分析,单纯从技术角度来看代码质量,其实又细分很多原因,如代码设计、代码规范、编程技巧等等,但我个人觉得这些都是技

聊一聊 C# 弱引用 底层是怎么玩的

一:背景 1. 讲故事 最近在分析dump时,发现有程序的卡死和WeakReference有关,在以前只知道怎么用,但不清楚底层逻辑走向是什么样的,借着这个dump的契机来简单研究下。 二:弱引用的玩法 1. 一些基础概念 用过WeakReference的朋友都知道这里面又可以分为弱短和弱长两个概念

聊一聊 Monitor.Wait 和 Pluse 的底层玩法

一:背景 1. 讲故事 在dump分析的过程中经常会看到很多线程卡在Monitor.Wait方法上,曾经也有不少人问我为什么用 !syncblk 看不到 Monitor.Wait 上的锁信息,刚好昨天有时间我就来研究一下。 二:Monitor.Wait 底层怎么玩的 1. 案例演示 为了方便讲述,先

聊一聊Java中的Steam流

在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用到并行处理,这样的处理方式是很复杂的。流可以帮助开发者节约宝贵的时间,让以上的事情变得轻松。

聊一聊被 .NET程序员 遗忘的 COM 组件

一:背景 1.讲故事 最近遇到了好几起和 COM 相关的Dump,由于对 COM 整体运作不是很了解,所以分析此类dump还是比较头疼的,比如下面这个经典的 COM 调用栈。 0:044> ~~[138c]s win32u!NtUserMessageCall+0x14: 00007ffc`5c891

聊一聊对一个 C# 商业程序的反反调试

一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他对一个商业的 C# 程序用 WinDbg 附加不上去,每次附加之后那个 C# 程序就自动退出了,问一下到底是怎么回事?是不是哪里搞错了,有经验的朋友应该知道,其实这是 商业程序 的反调试机制捣鬼的,为了保护程序隐私,一般都不希望他人对自己做逆

聊一聊 WPF 程序的键盘是如何被窃听的?

一:背景 1.讲故事 前几天群里很热闹,看了下在争论两个问题: 电脑里要不要装杀毒软件 ? 应该装什么杀毒软件 ? 不管杀毒软件流氓不流氓,在如今病毒肆虐的当下互联网,装一个还是能帮我们拦截很多意想不到的东西,为了眼见为实,这一篇我们就聊一个窃听 键盘事件 的恶意代码。 2. 思路 实现思路非常简单

聊一聊如何截获 C# 程序产生的日志

一:背景 1.讲故事 前段时间分析了一个dump,一顿操作之后,我希望用外力来阻止程序内部对某一个com组件的调用,对,就是想借助外力实现,如果用 windbg 的话,可以说非常轻松,但现实情况比较复杂,客户机没有windbg,也不想加入任何的手工配置,希望全自动化来处理。 真的很无理哈。。。不过这

聊一聊 SQLSERVER 的行不能跨页

一:背景 1. 讲故事 相信有很多朋友在学习 SQLSERVER 的时候都听说过这句话,但大多都是记忆为主,最近在研究 SQLSERVER,所以我们从 底层存储 的角度来深入理解下。 二:理解数据页 1. 数据页的组织 在前面的文章中我也说过,一个 数据页 是 8k 大小,那这 8k 是如何组织的呢