原文地址
本文翻译自:
https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/
https://www.wst.space/ssl-part-2-diffie-hellman-key-exchange/
作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理。理解这个复杂协议的基本原理花了我好几天的时间,但只要你理解了底层的概念和算法,就会感觉整个协议其实很简单。在学习SSL运作原理的过程中,我获益匪浅。回想起在大学期间学到的密码学,那段时间学习它们可是一件很无聊的事。现在,我开始明白老师为什么要让我学习加密的算法,因为密码学可以让我们的生活变得更加轻松。在这里,我想分享我所学到的一切,当然,我希望这对你能有所帮助。我们就此开始吧。
SSL的历史
在了解SSL的历史时,有必要提一下Mozilla Foundation。说到Mozilla,首先我们想到的是他们著名的浏览器Firefox。根据各种消息来源来看,Firefox是继Chrome和Safari之后最受欢迎的浏览器。但Firefox杰出的前身是Netscape,在90年代它是互联网用户中最受欢迎的浏览器。尽管这样,在微软推出了Internet Explorer之后,Netscape的时代也就随之结束了,之后他们便建立了著名的Mozilla基金会,它仍然在成长。
1994年,Netscape为Netscape Navigator浏览器研发了SSL。其作用主要是为了防止中间人攻击。后来,随着互联网可访问性的增加,银行开始利用互联网进行交易。当时安全性是一个很重要的问题,IETF (互联网工程任务组),也就是一群标准化互联网协议的人,他们研发属于自己的协议版本来标准化SSL,这是在1999年,现在该协议被称为TLS(传输层安全性),它的最新版本是TLS 1.3。
关于密码学的几点注意事项
首先,在深入研究这个话题之前,我们需要对几件事情有一个基本的了解。最重要的一个是密码学。理解SSL您不需要成为密码学专家,但基本的了解是必要的。我们接下来会在这里讨论基础知识。已经知道非对称和对称密钥加密的朋友们可以直接跳过本节进入下一部分。
密码学的处理对象是数字和字符串。基本上整个宇宙中的每一个数据都是数字。这里我们所说的数字,就是0和1,也就是二进制。你在屏幕上看到的图像,通过耳机听到的音乐,一切都是二进制文件,但我们的耳朵和眼睛都不能理解二进制文件吗?只有大脑才能理解这一点,但即使它能够理解二进制文件,它也无法享受二进制文件。因此,我们将二进制文件转换为人类可理解的格式,如mp3,jpg等。我们将这个过程称为编码,它是双向处理,可以很容易地解码成原始形式。
哈希
散列是另一种数据一旦转换为其他形式将永远无法恢复的加密技术。在Layman的术语中,没有称为去散列的过程。有很多哈希函数都可以完成这项工作,比如sha-512,md5等等。wst.space
的sha-512
值是,
83d98e97ec1efc3cb4d20f81a246bff06a1c145b7c06c481defed6ef31ce6ad78db3ecb36e7ce097966f019eab7bdc7ffa6b
3f b8c5226871667ae13a6728c63b
您可以通过访问某个在线创建哈希网站并输入wst.space
来验证。
如果无法恢复原始值,那么我们在哪儿可以使用它呢?密码!当你给移动设备或PC设置密码时,便会创建哈希密码然后存储在安全的位置。当您下次进行登录尝试时,再次使用相同的算法(散列函数)对输入的字符串进行散列,并将输出与存储的值进行匹配。如果它是相同的,你就会登录。否则你将无法登录。
对密码运用哈希算法,我们就可以确保攻击者即使窃取了存储的密码文件也永远不会得到我们的密码。攻击者有的只是密码的哈希值。他也可能会找到最常用密码的列表,然后将sha-512
应用于每个密码,再将其与手中的值进行比较,这种方法称为字典攻击。但这样做需要多久?如果您的密码足够随机,您认为这种破解方法是否有效?
我们在一篇博客文章中讨论了会话cookie。它的值是会话cookie,通常是哈希值。Facebook,Google和亚马逊数据库中的所有密码都经过哈希处理,或者至少它们应该被哈希化。
接下来是加密
加密位于散列和编码之间。编码是一个双向过程,不应用于提供安全性。加密也是一个双向过程,但当且仅当加密密钥已知时才能检索原始数据。如果您不知道加密的工作原理,请不要担心,我们将在此讨论基础知识。这对理解SSL的基础知识已经足够了。共有两种类型的加密,即对称加密和非对称加密。
对称密钥加密
我尽可能地说简单点。所以,我们可以通过移位算法来理解对称加密,这个算法是通过将字母向左或向右移动来加密字母表。我们取一个字符串CRYPTO并考虑一个数字+3,然后,CRYPTO的加密格式将是FUBSWR,也就是意味着每个字母向右移动3个位置。
这里,单词CRYPTO称为明文,输出FUBSWR称为密文,值+3称为加密密钥(对称密钥),整个过程为密码。这是最古老和最基本的对称密钥加密算法之一,其首次使用是在Julius Caesar时期,所以以他的名字命名,它是一种著名的凯撒密码。任何知道加密密钥并且可以应用凯撒算法的人都可以反向并检索原始明文。因此,它被称为对称加密。
我们可以使用TLS进行对称加密吗
如您所知,这种算法很容易破解,因为可能性较小。我们可以将key的值从1更改为任何内容,并逐个迭代26个字母。请注意,如果我们只加密小写英文字母,则key的值限制为26。我们的计算机使用Bruteforce处理这个过程只需几毫秒。如今,存在诸如AES(高级加密标准)和3DES(三重数据加密算法)的复杂算法。它们都被公认为很难破解。
这是在发送和接收数据时在SSL/TLS中使用的加密技术。但客户端和服务器需要在开始加密数据之前就密钥达成一致并进行交换,是这样的吗?交换密钥的最初步骤显然是纯文本。如果攻击者在共享密钥时捕获密钥怎么办?那使用它也就没有了意义。因此,我们需要一种安全机制来交换密钥,而不会让攻击者真正看到它。所以就出现了非对称密钥加密的作用。
非对称密钥加密
我们知道,在对称加密中,相同的密钥用于加密和解密。一旦该密钥被盗,所有数据都将消失。这是一个巨大的风险,我们需要更复杂的技术。1976年,Whitfield Diffie和Martin Hellman首次提出了非对称加密的概念,该算法被称为Diffie-Hellman密钥交换。然后在1978年,麻省理工学院的Ron Rivest,Adi Shamir和Leonard Adleman发表了RSA 算法。这些都可以被视为非对称加密的基础。
与对称加密相比,在非对称加密中,将有两个关键点而不是一个。一个称为公钥,另一个称为私钥。理论上,在启动期间,我们可以生成公私钥匙对我们的机器。私钥应保存在安全的地方,绝不应与任何人共享。顾名思义,公钥可以与希望向您发送加密文本的任何人共享。现在,那些拥有您的公钥的人可以使用它加密秘密数据。如果密钥对是使用RSA算法生成的,那么它们应该在加密数据时使用相同的算法。一般来说,加密算法会在公钥中指定,加密数据只能使用您拥有的私钥。
我们可以对所有TLS使用非对称加密吗
非对称加密也称为公钥基础结构,又称PKI,这样命名的原因是自解释。不管怎样,只要您保持私钥安全,数据就是安全的。多好啊!所以,现在你可能会想,为什么我们仍然会在TLS中使用对称加密?我们有很多安全的PKI啊。是的,我也同意。但应该指出,必须在不影响可用性的情况下再处理安全的问题。由于PKI涉及双密钥架构并且密钥长度通常很大,因此加密-解密开销非常高。与对称密钥加密相比,它需要更多的时间和CPU占有率。
因此,当在客户端和服务器之间发送和接收数据时,用户会感觉到等待的时间更久,而且浏览器会开始吃掉CPU。因此PKI仅用于在客户端和服务器之间交换对称密钥,此后,才是对称密钥加密开始起作用并且新的数据传输也使用了这种技术。好吧,我知道我只是在这里轻描淡写,因为我还没有真正涉足这个话题。请记住我们到目前为止所讨论的内容然后回到这儿,我们将从下一篇博客文章中深入探讨。
密钥交换算法
在博客系列的最后部分,我们已经讨论了密码学的基本概念:包括散列,对称和非对称加密等。除了他们的历史,我没有说过任何关于SSL或TLS的内容。我希望我们已经完成了基础部分,所以让我们挖掘点真实的东西吧。在这篇博文中,我们将根据Diffie-Hellman密钥交换的密钥交换算法。
了解SSL中的加密类型
从博客系列的最后一部分开始,我们知道在SSL中使用了对称加密和非对称加密,接下来,我们将看到使用了哪种加密算法,在哪里使用的以及使用的原因。
想象一下,你正在浏览Facebook,Facebook在默认情况下通过https重新路由您的所有流量。由于您使用的是TLS(我将在大多数地方使用TLS而不是SSL,因为它现在是标准的)连接,您会在URL栏上看到一个绿色框以确认该连接是安全的。在单个会话期间,您会进行多项活动,例如评论,聊天,在页面之间导航,滚动新闻源等等。每次执行这些操作时,在客户端和服务器之间会共享多个请求和响应,所有这些通信都必须通过https才能确保数据安全。这意味着服务器和客户端浏览器正在为单个Facebook会话加密和解密数据包100次。
我们知道公钥加密的解密密钥永远不会与任何人共享,所以比对称密钥加密更安全,但是,如果我们还知道,在公钥基础设施(PKI)中,与对称密钥加密相比,它使用更多的CPU而且需要更多的时间来加密和解密,开销更高,导致浏览器(和应用程序服务器)开始占用您的CPU资源;此外,浏览器每次都必须经历繁忙的加密步骤,所以需要更多的时间才能提供内容。
如何解决
鉴于以上原因,我们需要使用对称加密来实现这一目标,这样可以更快,资源消耗可以更少,两全其美。但客户端和服务器在开始加密之前必须就单个密钥达成一致,对吧?他们会怎么做?在共享唯一的密钥时,坐在客户端和服务器之间的攻击者可以捕获它和Kaboom!您的所有数据都泄漏了。故而必须有一种解决方法来共享密钥并在那里我们使用公钥加密。
在客户端和服务器之间共享并同意一个秘密密钥的一系列过程我们称为握手,这是TLS的第一步。握手涉及多个过程,整个过程称为公钥基础结构,还记得我们在博客系列的最后部分使用了这个术语吗?PKI包括证书颁发机构(CA),数字签名等,我们将在下面深入讨论基础架构。
密钥交换算法
因此,很明显非对称加密用于交换密钥,但用哪种算法呢?自从非对称密码学发明以来,提出了许多算法。在写这篇文章的过程中,TLS1.2是常用的标准,还有RSA、Diffie-Hellman密钥交换、ECDH(Elliptic Curve Diffie-Hellman)、SRP(安全远程密码)、由TLS 1.2支持密钥交换算法PSK(Pre Shared Key)。
在这里讨论所有算法可能是个麻烦事,相反我们将讨论最常见且易于理解的Diffie-Hellman密钥交换算法。
Diffie-Hellman Key Exchange解释
我不打算直接去算,因为这方面并不是我的强项,而是让我们尝试用颜色类比来理解这个概念。想象一下,Alice和Bob正在做一些海报工作,他们的对手 Mallory也坐在替补席旁边。Alice和Bob想要达成共识,使用一种颜色来设计海报,他们无法大声讨论,因为Mallory会听到它。那么他们如何统一颜色呢?这个问题的解决方案就是Diffie-Hellman密钥交换算法的最简单形式,接下来我们来一探究竟。
方案步骤
- 1.首先,Alice会选择一种常见的颜色,比如黄色,然后告诉Bob,她将在本次会议中使用黄色。显然,Mallory可以听到,但是没有关系。
- 2.然后,Alice和Bob选择他们自己的秘密颜色,他们不会告诉对方。所以Mallory永远不会知道秘密颜色。例如,Alice选橙色作为秘密颜色,Bob选绿色。
- 3.在这个步骤中,Alice将混合她的秘密颜色橙色和常用颜色黄色以产生新的颜色。凉鞋的颜色是可以吗?(我的颜色感觉不太好,原谅我。)
- 4.同样,Bob也将他的秘密颜色与黄色混合以生成新的蓝色。
- 5.Alice和Bob将告诉彼此这些新颜色。Mallory可以看到凉鞋颜色和蓝色,但不是他们的秘密颜色。
- 6.交换完成后,Alice会将她的秘密颜色(橙色)混合到Bob发送的混合物中。Bob会将他的秘密颜色(绿色)与Alice发送的混合物混合。
- 7.现在Alice和Bob都达到了一种共同秘密色彩的混合物。请参考下图。Mallory将会被凉鞋色和蓝色困住,因为Mallory不知道Alice和Bob的秘密颜色,所以他永远不会达到他们俩得到的共同的秘密颜色。
这里,共同色(Yellow)可以被视为服务器的公钥,每个人都可以使用。最后获得的公共秘密可以被认为是用于在进一步的会话中加密数据的对称密钥,这不完全正确,但对于基本的理解,我们先保持这样,如果你深入挖掘,相信你会理解到精确的逻辑。
Diffie-hellman密钥交换视频链接
Diffie-Hellman密钥交换背后的数学
让我们来看看上述算法背后的基本数学。为了更好地理解Diffie-Hellman的概念,我们需要了解模运算。那些不想看数学的朋友们可以跳过本节,其他人可以关注我。
很明显,当你将7和8加起来,你会得到15,这是小学算术问题。但是在12小时制的情况下,情况就不是这样的了。如果时间现在是7点,那么8小时后,时间将是3点。故而我们可以说时钟是算术模12的模运算的最简单的例子。在这种情况下,我们知道12:00也就相当于00:00,所以我们可以说12和0是一样的,反之亦然。
在数学上,
A = b(mod P)
如果我们将p的值设为12,将b设为21。然后,
21(mod 12)= 9
我们将其转换为Diffie-Hellman示例。在阅读以下内容时,请记住颜色类比。想象一下,Alice和Bob都知道g和p的值,或者Alice先前决定了这些值并将其发送给Bob。换句话说,这些值是公开的。现在,
观察到 S_A= S_B=K 。这是用于加密会话的会话密钥。
Mallory获得秘密钥匙的机会
在整个过程中,请注意Alice(a)的秘密和Bob(b)的秘密永远不会彼此共享。因此,Mallory只知道g,p,A和B.为了得到K的值,Mallory首先需要从A = g^a(mod p)和B = g^b(mod p)计算a&b ,数学上这被称为离散对数问题。对于较大的p值,要计算结果几乎100%不可行。在实际的TLS实现中,p的长度将在1024或2048位的范围内。也就是说,2048位密钥的长度在 2^2047
和 2^2048
之间。希望你知道一个2^3
长度的秘钥的最大值可以为8.想象一下2048位密钥得有多复杂。
当使用这样的密钥时,即使是世界上最大的超级计算机也将花费100年的时间才能计算出a&b。更不幸的是,这些值会随着每个会话而变化。所以啊,即使攻击者算出了这个值,在以下会话中他也无法用来模拟用户。这就是所谓的完美前瞻性保密。
我们现在安全吗
服务器和客户端浏览器已经同意安全共享通过强密钥交换算法的密钥,一切都看起来很不错。但是先等等,我们真的足够安全吗?让我们想象一下我们尝试使用https连接到facebook.com的场景,假设攻击者已经位于您的浏览器和Facebook服务器之间,您的浏览器将告诉Facebook服务器启动TLS通道,但攻击者可以设置自己的服务器,并通过他的服务器重新路由你和Facebook.com之间的所有通信,因此,当Facebook服务器发送其公钥时,攻击者可以用他的公钥替换它并将其转发给您。
然后下一步,您收到公钥认为它实际上来自Facebook.com,您的浏览器将使用它加密您的密钥并将其发送回Facebook。再一次,攻击者会抓住它并猜猜是什么?他有相应的私钥来解密密钥,然后用Facebook.com的公钥(他已经拥有)的原始值加密它并将其转发回Facebook.com,然后,他将继续进行加密 - 解密过程,如此一来,他就可以看到你和Facebook.com之间共享的所有内容。
现在怎么办
问题的答案是CA(证书颁发机构)。简单来说,证书颁发机构由X.509标准指定,以确保数据的完整性,数据完整性可确保在传输中的数据不会被第三方实体篡改。换句话说,CA充当浏览器和服务器之间的中间人,确保数据完整性是CA的职责。
我们将在下一篇博客文章中深入讨论CA。