漫谈密码技术

一封情书引发的安全问题

在现代通讯中,双方传输信息均通过网络传输,那么在这个过程中,就存在着如下的信息传输场景:

重要信息,使用明文在网络中传输很容易被窃听者窃听并攻击,造成严重的信息传输安全问题:

上述信息传输过程,让人容易想到:只需要对原文进行加密,不就可以了吗?形如:

在上图场景中,我们放心大胆的把加密后的密文传输给对方,就算窃听者窃取到了,对方没有密码就无法知道传输的原文信息,这种设计思想看起来很合理,但是会引发另俩个问题:

  • 加密的密钥的传输问题:双方使用的密钥怎么传输才能仅仅让对方知道?
  • 加密算法的安全性问题:密钥如何加密才能不会被黑客轻松破解?

本文会围绕这俩个核心问题展开讲解。其中涉及到:

  • 对称加密(对称密码)、非对称加密(公钥密码)、单向散列函数、消息认证码、数字签名、伪随即数生成器,这六种密码技术统称为:密码学家的工具箱
  • 中间人攻击
  • 证书
  • PKI
  • SSL/TLS

密码技术概述

加密和解密算法合在一起统称为密码算法。

对称密码与公钥密码

对称密码:是指加密和解密时使用同一个密钥的方式;

公钥密码:是指在加密和解密时使用不同密钥的方式,又称为非对称密码;

混合密码系统:是指将对称密码和公钥密码结合起来的密码方式;

其他密码技术

单向散列函数

单向散列函数是为了防止数据被篡改设计出来的,可以根据单向散列函数得出的散列值(又称哈希值、密码校验、指纹、消息摘要),对数据的完整性进行判断。如:MySQL官网下载软件包时提供MD5验证。

消息认证码

消息认证码是为了确认消息是否来自所期待的通信对象。通过消息认证码不仅能够保证完整性,也可以提供认证机制,但是它并不能防止否认和不能够对第三方进行确认。

数字签名

数字签名是一种将现实世界中的签名和盖章移植到数字世界中的技术。数字签名既可以检测出伪装和篡改,也可以防止事后否认。

伪随机数生成器

伪随机数生成器是一种能够模拟产生随机数列的算法。只有产生具有不可重现性(不可重现性 > 不可预测性 > 随机性)数值的伪随机数生成器才能够用于密码技术种。如在Web中进行SSL/TLS通信时需要使用伪随随机数生成器生成一个临时密钥(会话密钥),如果随机数算法不好,容易被推测出密钥。

密码技术小结

下图表示信息安全所面临的威胁与应对的密码技术:

从图中可以看出:消息认证码能防止的受威胁的特性,在单单向散列函数及数字签名中已经体现,因此目前实际常用的密码技术是:对称密码、公钥密码、单向散列函数、数字签名。

密码与信息安全常识

不要使用保密的密码算法

从历史上看,算法的秘密无一例外最终会被暴露出来。公开的算法从一开始就没有设想过要保密,因此算法的暴露丝毫不会削弱算法它们的强度。

高强度的密码不能像数学一样严密证明,事实上,如果专业密码破译者经过数年的尝试仍然没有破解某个密码算法,则说明这种算法的强度较高。目前世界公开的被认为强度较高的密码算法,都是经过密码破译者长期尝试破解未果而存活下来的。

使用低强度的密码比不进行任何加密更危险

与其使用低强度的密码,还不如从一开始就不适用任何密码。16世纪的苏格兰女王玛丽就曾认为没有人能够破译自己使用的密码。正是由于对于密码的盲信,导致她的刺杀计划被破译,将自己送上了断头台。 [扩展:玛丽女王的密码:http://www.oscca.gov.cn/sca/zxfw/2017-04/25/content_1011716.shtml]

任何密码总有一天都会被破解

密码算法生成的密文,只要把所有可能的密钥全部尝试一遍,时间允许的情况下,总会被破解。严格来说,绝对不会被破解的密码算法是存在的,这种算法成为一次性密码本。还有一种技术被认为有可能造就完美的密码技术,那就是量子密码。

密码只是信息安全的一部分

不用通过截取网络传输中的数据,而是通过攻击接收信息者的电脑设备,获取重要的信息。还有如社会工程学攻击等。系统的安全性是环环相扣的节点组成,每个环节都很重要。最脆弱的环节并不是密码,而是人类自己。

历史上的密码技术

凯撒密码

凯撒密码是通过将明文中所使用的字母表按照一定的字数“平移”来进行加密。

凯撒密码的加加密原理:

凯撒密码的缺陷

如果不知道平移的数字,那么可以通过暴力破解的方式进行破解。因为位移值就是密钥,因此有26种平移值的可能。

替换密码

对于简单替换密码技术可以这样理解:凯撒密码是通过平移字母来进行加密的,而简单替换密码则是将这种平移变成了无序对应,则可以将凯撒密码看作简单替换密码的一种特殊情况。

简单替换密码的加密和解密的原理与凯撒密码的大同小异,但是破解方式不同:恺撒密码可以通过暴力破解进行破译,而简单替换密码则需要频率分析进行破译。

简单替换密码很难通过暴力破解来破解:

因为破解可能的密钥数量远比凯撒密码多得多。

明文字母表中的a可以对应ABC…Z这26个字母,

明文字母表中的b可以对应BCD…Z这25个字母,

综上,替换密钥的总数为:

约为 4 兆(1兆等于1万亿)的1000兆倍,即使计算机每秒遍历 10 亿个密钥,遍历完所有需要花费 120 亿年时间。

频率分析

频率分析是利用了明文中的字母出现的频率与密文中的字母出现的频率一致这一特性,对简单替换密码进行破译。

例如如下密文:

首先统计一下密文中每个字母出现的频率,也就是,数一下每个字母出现多少次。

英文文章中一般出现频率最高的字母是 e,上表中出现频率最高的是 I 和 Y,假设其中一个是 e。假设 Y 的原文是 e 时,将原密文中的 Y 替换成 e,得到:

英语中最多出现的单词是 the,所以找以 e 结尾的 3 个字母组合,发现 MEe 出现频率很高,而且 MEe 出现在密文的开头,所以 MEe 很有可能就是 the。于是继续替换:

再动员所有日常使用的英语词汇,发现有个 thPee 比较可疑,这个词很有可能是:three(P 的原文为 r)

以此类推,通过频率分析法逐步破译替换密码,对于频率分析可以这样总结:

  • 除了高频字母以外,低频字母也能够成为线索;

  • 搞清开头和结尾能够成为线索,搞清单词之间的分隔也能偶成为线索;

  • 密文越长越容易破解;

  • 同一个字母连续出现能够成为线索(这是因为在简单替换密码中,某个字母在替换表中所对应的另一个字母是固定的)

  • 破译速度会越来越快

Enigma

恩尼格玛密码机(德语:Enigma,又译哑谜机,或「谜」式密码机)是一种用于加密与解密文件的密码机。

Enigma,是一种由键盘、齿轮、电池和灯泡组成的机器,通过这一台机器可以完成加密和解密两种操作。该机器由德国人 Arthur Scherbius 发明,刚刚发明之际用于商业,后来到了纳粹时期,德国军方该良之后用于军事用途。

内部结构

下图中的接线板是一种通过改变接线方式来改变字母对应关系的部件。接线板上的接线方式是根据国防军密码本的每日密码来决定的,在一天之中不会改变。

当输入一个字母时,转子1旋转1/4圈,转子1每旋转1圈的时候转子2旋转1/4圈,转子2每旋转1圈的时候转子3旋转1/4圈。

加密过程

解密过程

Enigma的弱点

加密通信密码是重要步骤(最开始的6次输入),实际只有转子1会旋转。

将通信密码连续输入俩次并加密,因为破译者可以知道,密文开头的6个字母被解密之后的明文一定是3个字谜重复俩次的形式。

通信密码是人为选定的,实现使用中,发送者使用如aaa,bbb或者女友的名字作为密码,太相信 Enigma 的安全性而忽略了密钥最好是用随机数来生成。

必须派发国防军密码本,密码本一旦丢失一本,那么就要重新制作新的密码本并发放到全军,这属于密钥配送的问题。

对称密码

对称密码又称为共享密码

比特序列密码

XOR运算,中文称为“异或运算”。

它的定义是:两个值相同时,返回false,否则返回true。也就是说,XOR可以用来判断两个值是否不同。

XOR 运算有一个很奇妙的特点:如果对一个值连续做两次 XOR,会返回这个值本身。

1
2
3
4
5
// 第一次 XOR
1010 ^ 1111 // 0101

// 第二次 XOR
0101 ^ 1111 // 1010

关于XOR的运算规则需要注意的是:

和加法运算不同的是,XOR 中不需要进位

两个相同的数进行 XOR 运算的结果一定为 0;

可以通过XOR运算规则,进行加密和解密:将明文 A 用密钥 B 进行加密,得到密文 A ⊕ B;将密文 A ⊕ B 用密钥 B 进行解密,得到明文 A;

一次性密码本

只要通过暴力破解法对密钥空间进行遍历,无论是什么密文总有一天都能够被破译,然而,一次性密码本是个例外。即使用暴力破解法遍历整个密钥空间,一次性密码本也绝对无法被破解。

一次性密码本的加密:

一次性密码本的解密:

一次性密码本是无法破译?

我们假设对一次性密码本的密文尝试进行暴力破解,那么总有一天我们会尝试到和加密时相同的密钥,也就能解密出明文midnight,这是毋庸置疑的事实。然而即使我们能够解密出midnight这个字符,我们也无法判断它是否是正确的明文。

所谓暴力破解,就是按顺序将所有的密钥都尝试一遍,并判断所得到的是不是正确的明文的方法。然而,在一次性密码本中,由于我们无法判断得到的是不是正确的明文,因此一次性密码本是无法破译的。

一次性密码本是无条件安全的,在理论上是无法破译的。( 1949年香农使用数学方法证明)

一次性密码本为什么没有被使用?

  • 密钥配送问题

    如果能有一种方法将密钥安全地发送出去,那么岂不是也可以用同样的方法来安全发送明文吗?

  • 密钥保存问题

    如果有办法安全保存与明文一样长的密钥,那不是也有办法安全保存明文本身吗?也就是说,从一开始我们根据就不需要密码。

  • 密钥的重用

    在一次性密码本中绝对不能重用过去用过的随机比特序列,一次性密码本中的“一次性”也正是由此而来。这是因为作为密钥的比特序列一旦泄密,过去所有的机密通信内容将全部被解密。

  • 密钥的同步

    当明文很长时,一次性密码本也会跟着变长。如果明文是一个大小为100MB的文件,则密钥的大小也一定是100MB。而且在通信过程中,发送者和接收者的密钥的比特序列不允许任何错位,否则错位的比特后的所有信息将无法解密。

  • 密钥的生成

    在一次性密码本中,需要生成大量的随机数。这里的随机数并不是通过计算机程序生成的伪随机数,而必须是无重复性的真正随机数。

综上所述,一次性密码本是一种几乎没有实用性的密码,但一次性密码本却孕育了流密码,流密码使用的不是真正的随机比特序列,而是伪随机数生成器产生的比特序列。

DES

DES(Data Encryption Standard)是1977年美国联邦信息处理标准( FIPS )中所采用的一种对称密码。

DES 是一种将 64 比特的明文加密成 64 位比特的密文的对称密码算法,它的密钥长度是 64 比特,但由于每隔 7 比特会设置一个用于错误检验的比特(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1),因此实质上其密钥长度是 56 比特。

DES 是以 64 比特的明文(比特序列)为一个单位来进行加密的,这个 64 比特的单位称为分组。以分组为单位进行处理的密码算法称为分组密码。

Feasted 网络

Feasted 网络/结构/密码不仅被用于 DES,在其他很多密码算法中也有应用;Feistel 网络中,加密的各个步骤称为轮,整个加密过程中就是进行若干次轮的循环,一共有 16轮;

轮函数的作用根据 “右侧” 和字密钥生成对 “左侧” 进行加密的比特序列,它是密码系统的核心;

Feistel 网络的轮数可以任意增加;

加密时无论使用任何函数作为轮函数都可以正确解密;

加密和解密可以用完全相同的结构来实现。

3DES

3DES是为了增加 DES 的强度,将 DES 重复 3 次所得到一种密码算法,缩写为3DES

三重 DES 是加密 → 解密 → 加密的过程,目的是为了让三重 DES 能够兼容普通的 DES(当三重 DES 中所有的密钥都相同时,三重 DES 也就是普通的 DES了),也就是说三重 DES 对 DES 具备向下兼容性;

如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥,这种三重DES称为DES-EDE2;如果密钥1 、密钥2、密钥3 全部使用不同的比特序列的三重DES称为DES-EDE3。

AES

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的),它的诞生就是来取代 DES。具体的加密流程如下图:

Rijndael 没有使用 Feistel 网络,而是使用了 SPN 结构;Rijndael 的输入分组为 128 比特,也就是 16 字节;

公钥密码

密钥配送

  • 通过事先共享密钥来解决

最简单的一种解决方法,就是事先用安全的方式将密钥交给对方,这称为密钥的事先共享。

  • 通过密钥分配中心来解决

密钥分配中心(KeyDistributionCenter,KDC)来解决密钥配送问题。当需要进行加密通信时,密钥分配中心会生成一个通信密钥,每个人只要和密钥分配中心事先共享密钥就可以了

  • 通过 Diffie-Hellman 密钥交换来解决

在DH密钥交换中,进行加密通信的双方需要交换一些信息,而这些信息即便被窃听者 窃听到也没有问题。根据所交换的信息,双方可以各自生成相同的密钥,而窃听者却无法生成相同的密钥。

  • 通过公钥密码来解决

公钥密码的一个重要性质,就是只有拥有解密密钥的人才能够进行解密。

接收者事先将加密密钥发送给发送者,这个加密密钥即便被窃听者获取也没有问题。发送者使用加密密钥对通信内容进行加密并发送给接收者,而只有拥有解密密钥的人(即接收者本人)才能够进行解密。

公钥密码

公钥密码中,密钥分为加密密钥解密密钥两种。

发送者用加密密钥对消息进行加密,接收者用解密密钥进行解密。加密密钥是发送者加密时使用的,而解密密钥则是接收者解密时使用的。

加密密钥和解密密钥的区别:

  • 发送者只需要加密密钥

  • 接收者只需要解密密钥

  • 解密密钥不可以被窃听者获取

  • 加密密钥被窃听者获取也没问题

解密密钥从一开始就是由接收者自己保管的, 因此只要将加密密钥交给发送者就可以解决密钥配送问题了,而根本不需要配送解密密钥。

RSA

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。

RSA 算法的可靠性基础:对极大整数做因数分解是很困难的。
RSA 是非对称算法,加解密使用不同的密钥。

两个密钥都可以用于加密,解密时需要使用另一个密钥。但是,通常用公钥加密私钥解密,因为公钥是近乎完全公开的,对于私钥加密的数据,有太多的人可以解密了。理论上 A 和 B 之间要通过 RSA 实现保密通信,需要 A 和 B 各自生成一组密钥,同时保管好自己的私钥;用对方的公钥加密要发送的消息,用自己的私钥解密对方发送过来的消息。

在签名的场景下,用私钥签名,公钥验签。

RSA 比 DES 等对称算法慢得多。一般在实际数据传输时,用 RSA 来加密比较短的对称密码,双方交换密码后再使用 DES 等对称算法传输数据。

RSA 算法原理

  • RSA加密:密文 = 明文 E mod N

    明文的 E 次方对 N 求余,得到的余数就是密文。

    E是加密(Encryption),N是数字(Number),{E,N}就是公钥。

  • RSA解密:明文 = 密文 D mod N

    密文的 D 次方对 N 求余,得到的余数就是明文。

    D是解密(Decryption),N是数字(Number),{D,N}就是私钥。

公私钥算法计算步骤:

公私钥使用方法:公钥加密的的密文,私钥可以解密。私钥加密的密文,公钥可以解密。

中间人攻击

中间人攻虽然不能破译RSA,但是却是一种针对机密性的有效攻击:

认证

单向散列函数

单向散列函数不同于加密技术,它不是对信息进行加密,而是为了证明数据的完整性,防止数据被篡改,但是无法辨别出“伪装”(这个需要认证技术)。应用例子:MD5、SHA-1、SHA-256、SHA-384、SHA-512、PIPEMD-160

单向散列函数的应用场景:检测软件是否被篡改、基于口令的加密、消息认证码、数字签名、伪随机数生成、一次性口令

MySQL 官网展示的软件 MD5 值:

扩展

王小云(1966年8月-)中国密码学家。山东大学数学学院教授,博士生导师。成功破解了五大国际著名密码算法:MD5、HAVAL-128、MD4 、RIPEMD 和 SHA-1

2004年的国际密码讨论年会(CRYPTO)尾声,王小云及其研究同事展示了MD5、SHA-0及其他相关散列函数的散列冲撞。王小云提供了第一个碰撞示例。

2005年2月,王小云与其同事提出SHA-1散列函数的散列冲撞。王小云所提的散列冲撞算法只需少于2^69步骤,少于生日攻击所需的2^80步。同年8月,王小云、姚期智,以及姚期智妻子姚储枫联手于国际密码讨论年会提出SHA-1散列函数散列冲撞算法的改良版。此改良版使破解SHA-1时间缩短为2^63步。

一个安全的散列算法需要满足如下两个条件,也是散列算法的两个特性。

(1)抗碰撞性。根据一个输入,找到一个其它输入得到相同的输出,在计算上是不可行的;

(2)不可逆性。根据一个输出,找到一个输入其散列值等于输出,在计算上是不可行的,即不可能从结果逆向推导初始值。

综上所述:王小云的研究成果:MD5(M1)=MD5(M2)

数字签名

在中间人攻击中,可以得出发送公钥给对方,可能会被截获,接收公钥的人不知道自己收到的公钥是不是真正的公钥,思考:怎么保证公钥在传输过程中“保真”呢?

能不能设计一种算法:对当前要传输的公钥进行签名,然后再传输给对方,对方用验证密钥验证签名是不是合法,如果合法就表示当前的公钥是“真”的。

这种算法其实已经在上文中出现了,就是将公私钥的用法反过来使用:私钥加密的文件,只有对应的公钥解密,所以可以作为数字签名的一种算法实现:

数字签名有两种功效

一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。

二是数字签名能确定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将发生变化。不同的文件将得到不同的数字摘要。

一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥。

验证签名的公钥在传输过程中被别人“调包”了是完全没用的。

因为假的公钥是验证不成功这个数字签名,所以就可以认为当前数字签名不合法或者当前验证签名的公钥是“假”的。

数字签名的应用实例:安全信息公告、软件下载、公钥证书、SSL/TLS

实现数字签名的方式:RSA实现、ElGama实现、DSA实现、Rabin方式

PKI

用数字签名既可以识别出篡改和伪装,还可以防止否认。也就是说,我们同时实现了确认消息的完整性、进行认证以及否认防止。代社会中的计算机通信从这一技术中获益匪浅。数字签名看上去很完善,但是有个很重要的前提:用于验证签名的公钥必须属于真正的发送者

现在我们发现自己陷人了一个死循环一一一数字签名是用来识别消息篡改、伪装以及否认的,但是为此我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。

为了能够确认自己得到的公钥是否合法,我们需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。

当然,这样的方法只是把问题转移了而已。为了对证书上施加的数字签名进行验证,我们必定需要另一个公钥,那么如何才能构筑一个可信的数字签名链条呢?又由谁来颁发可信的证书呢?到这一步,我们就已经踏入了社会学的领域。我们需要让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施(Public Key Intrastructure),简称PKI

国际知名的 CA 机构市场份额占比:https://en.wikipedia.org/wiki/Certificate_authority

数字证书

公钥证书(Public-Key Certificate,PKC)其实和驾照很相似,里面有姓名,组织、邮箱、地址等个人信息,以及属于此人的公钥,并由认证机构(Certification Authority、Certifying Authority,CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也简称证书。

数字证书有很多格式版本,主要有X.509v3(1997)、X509v4(1997)、X.509v1(1988)等。比较常用的版本是TUTrec.x.509V3,由国际电信联盟制定,内容包括证书序列号、证书有效期和公开密钥等信息。不论是哪一个版本的数字证书,只要获得数字证书,用户就可以将其应用于网络安全中。

crt和cer都是证书,通常window系统下是cer,linux和Unix是用crt。crt可能是PEM编码,也可能是DER编码,大多数应该是PEM编码。cer可能是PEM编码,也可能是DER编码,大多数应该是DER编码。

构成PKI的三要素

  • 用户:使用PKI的人,也称为实体(Entity)

  • 认证机构:颁发证书的人

  • 仓库:保存证书的数据库

安全服务器:安全服务器面向普通用户,用于提供证书申请、浏览、证书撤销列表、证书下载等安全服务;用户需要首先得到安全服务器的证书(该证书由CA颁发);

注册机构RA:在CA体系结构中起承上启下的作用,一方面向CA转发安全服务器传输过来的证书申请请求,另一方面向LDAP服务器和安全服务器转发CA颁发的数字证书和证书撤销列表(CRL)。

LDAP服务器:Lightweight Directory Access Protocol(轻量目录访问协议),提供目录浏览服务,负责将注册机构服务器RA传输过来的用户信息以及数字证书加入到服务器上。用户通过访问LDAP服务器就能够得到其他用户的数字证书。

CA服务器:整个证书机构的核心,负责证书的签发。CA首先 产生自身的私钥和公钥,然后生成数字证书,并且将数字正常传输给

安全服务器。CA还负责为安全服务器、RA服务器生成数字证书。

数据库服务器:CA中的核心部分,用于CA中数据(如密钥和用户信息等)、日志、统计信息的存储和管理。

证书的申请过程

1、用户申请:用户获取CA的数字证书(根证书),与安全服务器建立连接;生成自己的公钥和私钥,将公钥和自己的身份信息提交给安全服务器,安全服务器将用户的申请信息传送给RA服务器。

生成数字证书代码示例:https://www.example-code.com/java/csr_generate_key_and_signing_request.asp

2、RA审核:RA收到用户的申请,用户向RA证明自己的身份,RA进行核对。如果RA同意用户申请证书的请求,则对证书申请信息做数字签名;否则拒绝用户的申请。

3、CA发行证书:RA将用户申请和RA签名传输给CA,CA对RA数字签名做认证,如果验证通过,则同意用户请求,颁发证书,然后将证书输出。如果验证不通过,则拒绝证书申请。

4、RA转发证书:RA从CA得到新的证书,首先将证书输出到LDAP服务器以提供目录浏览,再通知用户证书发行成功,告知证书序列号,到指定的网址去下载证书。

5、用户证书获取:用户使用证书序列号去指定网址下载自己的数字证书,只有持有与申请时提交的公钥配对的私钥才能下载成功。

证书的吊销过程

1、用户申请:用户向RA发送一封签名加密邮件,申请撤销证书。RA审核:注册机构同意证书撤销,并对申请签名。

2、CA更新CRL:CA验证证书撤销请求的RA签名,如果正确,则同意申请,并更新CRL,并输出。

3、RA转发CRL:注册中心收到CRL,以多种方式将CRL公布(包括LDAP服务器)。

4、用户告知:用户访问LDAP服务器,下载或浏览CRL。

CSR,certificate signing request,证书签名申请

CRL,certificate revocation list,证书吊销列表

OCSP,online certificate status protocol,在线证书状态协议

认证中心CA负责维护和发布证书废除列表CRL(certificate revocation lists,又称为证书黑名单或证书吊销列表)。当一个证书,特别是其中的公钥因为其他原因无效时(不是因为到期),CRL提供了一种通知用户和其他应用的中心管理方式。CA系统生成CRL以后,放到LDAP服务器中或Web服务器的合适位置,供用户查询或下载。

SSL/TLS

不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

(1) 窃听风险(eavesdropping):第三方可以获知通信内容。

(2) 篡改风险(tampering):第三方可以修改通信内容。

(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

(1) 所有信息都是加密传播,第三方无法窃听。

(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。

(3) 配备身份证书,防止身份被冒充。

互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。

SSL

SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议可分为两层:

SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。

SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

TLS

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。

TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

SSL/TLS通信流程

整个SSL/TLS握手阶段一共有4次通信:

1、客户端发出请求(ClientHello)

客户端先向服务器发出加密通信的请求,并向服务器提供以下信息:

支持的协议版本,如TLS 1.0

一个客户端生成的随机数,稍后用于生成对话密钥

支持的加密方法,如RSA公钥加密支持的压缩方法

2、服务器回应(ServerHello)
确认加密通信协议版本。如果浏览器与服务器支持的版本不一致,则服务器关闭加密通信

一个服务器生成的随机数,稍后用于生成对话密钥

确认加密方法,比如RSA公钥加密。

服务器证书

此处,如果服务器需要确认客户端的身份,如金融机构需要客户提供USB密钥(U盾),就会向客户端请求证书。

3、客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书没有问题,客户端就会从证书中取出服务器的公钥。

一个随机数,稍后用于生成对话密钥,并且只用服务器的公钥加密,防止被窃听。

编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送

客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验

如果前一步要求了客户端证书,则会发送证书及相关信息。

4、服务器回应

编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送

服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验

至此,整个握手阶段全部结束。接下来,客户端与服务器进入HTTPS加密通信,后续完全是使用普通的HTTP协议,只不过用“会话密钥”加密内容。

总结

对称密码

主要是为了确保消息的机密性。目前主要使用的是 AES ,它的算法为Rrijndael算法;

除了 AES 还有DES、三重 DES,它们是差分分析和线性分析。

公钥密码

是一种不同的密钥进行加密和解密的技术,也是用于确保消息的机密性(主要是密钥分配问题)。

使用最为广泛的一种公钥密码算法是 RSA,除此之外还有 ELGamal 和 Rabin 等算法,以及与其相关 Diffie-Hellman 密钥交换(DH)和椭圆曲线 Diffie-Hellman 密钥交换(ECDH)等技术。

公钥密码和对称密码一般都组成混合密码系统来使用的。

单向散列函数

是一种将长消息转换为短散列值的技术,用于确保消息的完整性。

包括的算法有SHA-1、SHA-2(SHA-256、SHA-384和SHA-512)和 SHA-3,除了SHA系列算法,还有MD4、MD5和 ROIPED-160 算法。

单向散列函数可以单独使用,也可以作为消息认证码、数字签名以及伪随机数生成器等技术的组成元素来使用

消息认证码

是一种能识别通信对象发送的消息是否被篡改的认证技术,用于验证消息的完整性,以及对消息进行认证。

该技术是利用了单向散列函数的HMAC,但是无法对第三方进行认证,也无法防止否认。

数字签名

是一种能够对第三方进行消息认证,并能够防止通信对象做出否认的技术。

数字签名的算法有RSA、ElGamal、DSA、椭圆曲线 DSA(ECDSA)、爱德华兹曲线DSA(EDDSA)等。

伪随机数生成器

是一种能够生成具备不可预测性的比特序列的技术;由密码和单向散列函数构成的;伪随机数生成器用于生成密钥、初始化向量和 nonce 等。

参考资料

参考书籍

图解密码技术(第3版) ([日]结城浩)

HTTPS权威指南 在服务器和Web应用上部署SSL TLS和PKI

深入浅出HTTPS:从原理到实战

数学之美(第17章 由电视剧《暗算》所想到的——谈谈密码学的数学原理)

参考博客

《图解密码技术》第三章(对称密码)学习笔记:https://muzibing.github.io/2019/06/16/2019.06.16%EF%BC%8869%EF%BC%89/

RSA算法原理(二)- 阮一峰的网络日志:http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

RSA算法详解:https://blog.damonare.cn/2017/12/31/RSA%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/

一文搞懂 RSA 算法:https://zhuanlan.zhihu.com/p/44185847

PKI/CA工作原理及架构:https://www.jianshu.com/p/c65fa3af1c01

HTTPS协议详解(一):HTTPS基础知识:https://blog.csdn.net/hherima/article/details/52469267

5分钟让你知道什么是PKI:https://www.cnblogs.com/jerain6312/p/8572841.html

PKI系统深入介绍:https://blog.csdn.net/liuhuiyi/article/details/7776825

RSA(五) PKI (Public Key Infrastructure) 公钥基础设施:https://www.shangyang.me/2017/05/25/encrypt-rsa-pki/

HTTP与HTTPS的区别:http://www.mahaixiang.cn/internet/1233.html

网络7层协议,4层,5层?理清容易混淆的几个概念:https://blog.csdn.net/cc1949/article/details/79063439

SSL/TLS协议详解(下)——TLS握手协议:https://xz.aliyun.com/t/2531

SSL/TLS协议运行机制的概述 -阮一峰的网络日志:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

Bouncycastle API文档:https://www.bouncycastle.org/documentation.html

扩展

https://javadoc.scijava.org/

https://codebeautify.org/

https://examples.javacodegeeks.com/

https://www.owasp.org/index.php/Main_Page

http://www.javased.com/

https://www.bouncycastle.org/documentation.html

updated updated 2020-03-01 2020-03-01
本文结束感谢阅读

本文标题:漫谈密码技术

本文作者:木鲸鱼

微信公号:木鲸鱼 | woodwhales

原始链接:https://woodwhales.cn/2019/09/27/049/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%