细读HTTPS -- SSL/TLS历史,密码学

细读HTTPS – SSL/TLS历史,密码学

SSL/TLS协议历史

SSL协议由Netscape公司开发,历史可以追溯到Netscape Navigator浏览器统治互联网的时代。

  • 第一个版本从未发布过
  • 第二版即SSL2则于1994年11月发布。SSL2的开发基本上没有与Netscape以外的安全专家进行过商讨,所以有严重的弱点,被认为
    是失败的协议,最终退出了历史的舞台
  • SSL3于1995年年底发布,虽然名称与早先的协议版本相同,但SSL 3是完全重新设计的协议。该设计一直沿用到今天。
  • TLS 1.0于1999年1月问世。尽管与SSL3相比,版本修改并不大,但是为了取悦Microsoft,协议还是进行了更名,SSL更名为TLS
  • TLS 1.1于2006年4月发布,仅仅修复了一些关键的安全问题.
  • TLS 1.2于2008年8月发布,。该版本添加了对已验证加密的支持,并且基本上删除了协议说明中所有硬编码的安全基元,使协议完全弹性化。
  • 协议的下一个版本正在开发过程中。

密码学

讨论密码学时,我们为了方便起见,通常会使用Alice和Bob这两个名,Eve为一位具备窃听能力的攻击者命名,Mallory为另一位能够妨碍网络流量的主动攻击者命名.

对称加密

对称加密(symmetric encryption)又称私钥加密(private-key cryptography),是一种混淆算法,能够让数据在非安全信道上进行安全通信。为了保证通信安全,Alice和Bob首先得到双方都认可的加密算法和密钥。当Alice需要向Bob发送数据时,她使用这个密钥加密数据。Bob使用相同的密钥解密。Eve能够访问信道,所以可以看到加密数据;但因为没有密钥,所以看不到原始数据。Alice和Bob只要能保证密钥安全,就能一直安全地通信,如图1-1所示。
duicheng
对称加密的密码分为两大类:序列密码和分组密码

  • 序列密码
    序列密码的核心是生成一串称为密钥序列(keystream)的无穷序列,看似杂乱无章。加密就是将密钥序列中的1字节与明文序列中的1字节进行异或操作。因为异或操作是可逆的,所以解密就是将密文序列中的1字节与密钥序列中的相同字节进行异或操作。如下图所示:
    jiami
    RC4是最为人熟知的序列密码①。因为它很快很简单,所以一度非常流行。但是它已经不再安全。
    只要攻击者无法预测密钥序列中对应位置的字节,就可以认为加密过程是安全的。基于这个理由,序列密码绝不能第二次使用相同的密钥,这一点非常关键。这是因为在实际使用中,攻击者知道或者可以预测特定区域的明文(请思考加密HTTP请求的情景;许多请求的请求法、协议版本、请求头名称都是一样的)。当你知道明文,又观察到密文时,就可以解析一部分密钥序列。如果使用了相同的密钥,那么就可以解密后续的部分密文。为了解决这个问题,序列密码都与从长期密钥中提取出来的一次性密钥一同使用。
  • 分组密码
    一种分组密码就是一个变换函数:接受输入并生成看似杂乱无章的输出。只要使用相同的密钥,每一个可能的输入组合都有唯一的输出。分组密码的关键特性是在输入上制造一个小变化(比如,在任意一处变换1位),从而得到大量输出变体。
    分组密码本身不是非常有用,因为它们自身有一些限制:
    • 只能使用它们加密长度等于加密块大小的数据。因此在实际使用分组算法时,需要一个方法处理任意长度的数据。
    • 分组密码是确定的。对于相同的输入,输出也是相同的。这个特性会使许多攻击成为可能,需要解决。
    • 实践中,人们通过称为分组密码模式(block cipher mode)的加密方案来使用分组密码。
    • 世界上最流行的分组密码是高级加密标准(advanced encryption standard,AES),可以使用128位、192位和256位的加密强度.
  • 填充
    分组密码的挑战之一是处理数据长度小于加密块大小的数据加密。举个例子,128位的AES需要16字节的输入数据并且产出相同长度的出。如果你的数据刚好能归入16字节的块中,那正好。但如果不足16字节,怎么办?一种方法是追加额外的数据到明文的尾部。这些额外的数据就被称为填充(padding)。
    在TLS中,加密块的最后1字节包含填充长度,指示填充有多少字节(不包含填充长度字节)。填充的每字节都被设置成与填充长度字节同的值,如图下图所示。这种方式使得接收方能够检查填充是否正确。为了在解密后丢弃填充,接收方检查数据块的最后1字节,删除它。接着,接收方删除指定长度的字节数,同时检查它们是否都是相同的值。
    TLS

分组密码模式

分组密码模式是为了加密任意长度的数据而设计的密码学方案,是对分组密码的扩展。所有分组密码模式都支持机密性,不过有些将其与身份验证联系起来。一些模式会将分组密码转换成序列密码。
它有许多输出模式,通常以首字母缩写来引用:ECB、CBC、CFB、OFB、CTR、GCM,诸如此类(不用担心这些缩写都代表什么)。我在这里只会介绍ECB和CBC:ECB是设计一种分组加密模式的反面例子,而CBC则仍是SSL和TLS的主要模式。GCM是TLS中相对较新的模式,从1.2版本开始才能使用。它提供了机密性和完整性,是当前可用的最好模式。

ECB

电码本模式(electronic codebook)是最简单的分组密码模式。它只支持数据长度正好是块大小的整数倍的情况,如果数据长度不满足这个条件,就得事先实施填充。加密就是将数据按块大小切分,再分别加密每一块。

CBC

加密块链接(cipher block chaining,CBC)模式是从ECB发展而来的下一步。为了解决ECB天生的确定性,CBC引入了初始向量(initialization vector,IV)的概念。即使输入相同,IV也可以使每次的输出都不相同。
如图下图所示,整个过程开始于生成一个随机IV(因此不可预测),长度与加密块相等。加密前,明文第一块内容与IV进行异或操作。这一步对明文进行了掩饰,并保证密文总是不尽相同。对于下一个加密块,使用上一块的密文作为IV,以此类推。这样一来,每次加密操作都是同一个加密链条中的一部分,这也是这种模式名称的由来。至关重要的是,IV必须通过线路传送到接收端,这个信息是成功解密所必需的。
CBC

非对称加密

对称加密在高速处理大量数据方面做得非常好,然而随着使用它的团体增加,产生了更多的需求,使得对称加密无法满足。

  • 相同团体的成员必须共享相同的密钥。越多人加入,团体密钥出现问题的次数就越多。
  • 为了更好的安全性,你可以在每两个人之间使用不同的密钥,但是这个方法不可扩展
  • 对称加密不能用于访问安全数据的无人系统。因为使用相同的密钥可以反转整个过程,这样的系统出现任何问题都会影响到存储在系统中的所有数据。
    非对称加密(asymmetric encryption)又称为公钥加密(public key cryptography),它是另一种方法,使用两个密钥,而不是一个;其中一个密钥是私密的,另一个是公开的。顾名思义,一个密钥用于私人,另一个密钥将会被所有人共享。这两个密钥之间存在一些特殊的数学关系,使得密钥具备一些有用的特性。如果你利用某人的公钥加密数据,那么只有他们对应的私钥能够解密。从另一个方面讲,如果某人用私钥加密数据,任何人都可以利用对应的公钥解开消息。后面这种操作不提供机密性,但可以用作数字签名。
    moxiang
    RSA(得名于三个人的姓氏首字母:Ron Rivest、Adi Shamir和Leonard Adleman)是目前最普遍部署的非对称加密算法①。现在推荐的RSA强度是2048位,强度等同于112位的对称密钥。

消息验证代码

消息验证代码(messageauthentication code,MAC)是以身份验证扩展了散列函数的密码学函数。只有拥有散列密钥,才能生成合法的MAC。
((原始消息) + 秘钥) * 散列函数 = 散列值(消息认证码)

散列函数

散列函数(hash function)是将任意长度的输入转化为定长输出的算法。散列函数的结果经常被简称为散列(hash)。编程中普遍使用散列函数,但并非所有散列函数都适用于密码学。密码学散列函数有以下几个额外特性:

  • 抗原像性(单向性)
    给定一个散列,计算上无法找到或者构造出生成它的消息。
  • 抗第二原像性(弱抗碰撞性)
    给定一条消息和它的散列,计算上无法找到一条不同的消息具有相同的散列。
  • 强抗碰撞性
    计算上无法找到两条散列相同的消息。

散列函数最常用的使用场合是以紧凑的方式表示比较大量数据。比如,为了避免直接比较两个文件(可能很难,比方说,它们存放于世界上不同的位置),你可以比较它们的散列。散列函数经常被称为指纹、消息摘要,或者简单称为摘要。
现在使用最为广泛的散列函数SHA1,它的输出是160位。因为SHA1已经变弱,所以建议升级为SHA256的变种.

数字签名

数字签名(digital signature)是一个密码学方案。它使得验证一条电子消息或者一篇电子文档的真实性成为可能。前面描述的MAC就是一种电子签名,它可以利用事先安全交换的散列密钥验证真实性。
以RSA为例。RSA可以用于加密,也可以用于解密。如果使用RSA私钥加密,那么仅能通过对应的公钥解密。我们可以利用这个性质,并且结合散列函数,实现数字签名。

  1. 计算希望签名的文档的散列。不论输入文档的长度如何,输出长度总是固定的。比如,使用SHA256就是256位。
  2. 对结果散列和一些额外的元数据进行编码。比如,接收方需要知道你使用的散列算法,否则不能处理签名。
  3. 使用私钥加密编码过的结果散列,其结果就是签名,可以追加到文档中作为身份验证的依据。
  4. 接收方接收文档并使用相同的散列算法独立计算文档散列。接着,她使用公钥对消息进行解密,将散列解码出来,再确认使用的散列算法是否正确,解密出的散列是否与本地计算的相同。
发布了20 篇原创文章 · 获赞 0 · 访问量 554

猜你喜欢

转载自blog.csdn.net/weixin_38537730/article/details/104161101