【HTTPS权威指南】第一章SSL,TLS和密码学

 

《微信读书-HTTPS权威指南:在服务器和web上部署SSL/TLS和PKI数字版权声明》

1.传输安全层

SSL和TLS都是加密协议,旨在基于不安全的基础设施提供安全通信.

TLS目的:
(1)加密安全;
(2)互操作性;
(3)可扩展性;
(4)效率.

2 网络层

IP和TCP不是唯一易受攻击的协议,还有一系列其他路由协议用于协助发现网络上的其他计算机。
DNS和BGP就是这样的两个协议。它们同样是不安全的,可以被他人通过各种方式劫持。

如果出现这种情况,发往一台计算机的连接可能由攻击者响应。如果部署了加密,攻击者也许有能力得到
加密数据的访问权限,但是不能解密数据或者篡改数据。为了避免伪装攻击,SSL和TLS依赖另外一项被称
为公钥基础设施(public key infrastructure, PKI)的重要技术,确保将流量发送到正确的接收端。

3 协议历史

SSL 1 第一版未发布过,第二版1994年11月发布,由Netscape公司开发.
SSL 2 失败的协议
SSL 3 1995年年底发布,虽然名称与早先的协议版本相同,但SSL3是完全重新设计的协议,该设计一直沿用
到今天.
1996年5月,TLS工作组成立,开始将SSL从Netscape迁移至IETF,Microsoft与Netscape争夺在Web上的份额.
TLS 1.0于1999年1月问世,见RFC2246,尽管与SSL 3相比,版本修改并不大,但是为了取悦Microsoft,协议还是进行了更名.
TLS 1.1于2006年4月问世;
TLS 1.2于2008年8月发布.

4 密码学

我最喜欢的一本书是《深入浅出密码学》(Understanding Cryptography,作者是Christof Paar和Jan
Pelzl,2010年由Springer出版)

4.1 构建模块

4.1.1 对称加密 

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

讨论加密时通常会使用到三个术语:
(1)明文(plaintext,即原始数据);
(2)密钥(cipher,用于加密);
(3)密文(ciphertext,即加密后的数据).


密码可以分为两大类
(1)序列密码;
(2)分组密码.

序列密码:
序列密码(stream cipher)的操作过程与我们想象中加密的过程一致。将1字节的明文输入加密算法,就
得到1字节的密文输出。在对端则进行相反的过程。整个过程持续重复,直到所有数据处理完成。序列密
码的核心是生成一串称为密钥序列(keystream)的无穷序列,看似杂乱无章。加密就是将密钥序列中的1
字节与明文序列中的1字节进行异或操作。因为异或操作是可逆的,所以解密就是将密文序列中的1字节与
密钥序列中的相同字节进行异或操作.


分组密码:
分组密码(block cipher)每次加密一整块数据,并且现代的分组密码倾向于使用128位(16字节)大小
的块。一种分组密码就是一个变换函数:接受输入并生成看似杂乱无章的输出。只要使用相同的密钥,每
一个可能的输入组合都有唯一的输出.分组密码的关键特性是在输入上制造一个小变化(比如,在任意
一
处变换1位),从而得到大量输出变体.


分组密码的挑战之一是处理数据长度小于加密块大小的数据加密.
填充不能由任何随机数据构成,它必须遵循某种格式,这样接收方才可以发现填充并了解需要丢弃多
少字节。在TLS中,加密块的最后1字节包含填充长度,指示填充有多少字节(不包含填充长度字节).


世界上最流行的分组密码是高级加密标准(advanced encryption standard,AES),可以使用
128位、192位和256位的加密强度.


典型的序列密码:RC4是最为人熟知的序列密码;
典型的分组密码:AES.

4.1.2 散列函数

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

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


散列函数最常用的使用场合是以紧凑的方式表示并比较大量数据.比如,为了避免直接比较两个文件(可能
很难,比方说,它们存放于世界上不同的位置),你可以比较它们的散列.散列函数经常被称为指纹、消息
摘要,或者简单称为摘要。现在使用最为广泛的散列函数是SHA1,它的输出是160位. 因为SHA1已经变
弱,所以建议升级为SHA256的变种. 与密码不同,散列函数的强度并不与散列长度对等. 因为生日悖论
(概率论中的常见问题),散列函数的强度最多只是散列长度的一半.

4.1.3 消息验证代码

散列函数可以用于验证数据完整性,但仅在数据的散列与数据本身分开传输的条件下如此。否则攻击者可
以同时修改数据和散列,从而轻易地避开检测。消息验证代码(message authentication code, MAC)或
者使用密钥的散列(keyed-hash)是以身份验证扩展了散列函数的密码学函数。只有拥有散列密钥,才能
生成合法的MAC。

MAC通常与加密一起使用。如果没有MAC,即使Mallory无法解码密文,她也能修改传输中的数据;加密提
供了机密性但无法确保完整性。如果Mallory聪明到可以修改密文,她就可以诱使Bob接受并相信伪造的消
息。当MAC和密文一起发送时,(和Alice共享散列密钥的)Bob就能确认消息并未遭到篡改。

任何散列函数都能用作MAC的基础,另一个基础是基于散列的消息验证代码(hash-based message 
authentication code, HMAC)[插图]。HMAC本质就是将散列密钥和消息以一种安全的方式交织在一起.

4.1.4 分组密码模式

分组密码模式是为了加密任意长度的数据而设计的密码学方案,是对分组密码的扩展。所有分组密码模式
都支持机密性,不过有些将其与身份验证联系起来。一些模式会将分组密码转换成序列密码.它有许多输
出模式,通常以首字母缩写来引用:ECB、CBC、CFB、OFB、CTR、GCM,诸如此类(不用担心这些缩写都代表什么).


介绍ECB和CBC:
ECB是设计一种分组加密模式的反面例子,而CBC则仍是SSL和TLS的主要模式. GCM是TLS中相对较新的模
式,从1.2版本开始才能使用. 它提供了机密性和完整性,是当前可用的最好模式.



ECB:
电码本(electronic codebook, ECB)模式是最简单的分组密码模式。它只支持数据长度正好是块大小的
整数倍的情况,如果数据长度不满足这个条件,就得事先实施填充。加密就是将数据按块大小切分,再分
别加密每一块。
ECB的简单就是它的劣势。因为分组密码是确定的(输入相同,输出也相同),所以ECB也是如此。这就造
成了严重的负面结果:
(1) 密文中出现的模式显示出明文中对应出现的模式;
(2) 攻击者可以发现信息是否重复;
(3) 攻击者可以观察密文并且提交任意明文加密(在HTTP中通常是可能的,在一些其他情况下也可以),如
此尝试足够的次数,就能猜出明文.这就是针对TLS的BEAST攻击的大致思路.


CBC:
加密块链接(cipher block chaining, CBC)模式是从ECB发展而来的下一步。为了解决ECB天生的确定
性,CBC引入了初始向量(initialization vector, IV)的概念。即使输入相同,IV也可以使每次的输
出都不相同.

整个过程开始于生成一个随机IV(因此不可预测),长度与加密块相等. 加密前,明文第一块内容与
IV进行异或操作. 这一步对明文进行了掩饰,并保证密文总是不尽相同. 对于下一个加密块,使用上
一块的密文作为IV,以此类推。这样一来,每次加密操作都是同一个加密链条中的一部分,这也是这
种模式名称的由来. 至关重要的是,IV必须通过线路传送到接收端,这个信息是成功解密所必需的.

4.1.5 非对称加密

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

(1)相同团体的成员必须共享相同的密钥,越多人加入,团体密钥出现问题的次数就越多;
(2)为了更好的安全性,你可以在每两个人之间使用不同的密钥,但是这个方法不可扩展。虽然3个人只需
要3个密钥,但10个人就需要45(9+8+…+1)个密钥,而1000个人需要499500个密钥!
(3)对称加密不能用于访问安全数据的无人系统。因为使用相同的密钥可以反转整个过程,这样的系统出
现任何问题都会影响到存储在系统中的所有数据.


非对称加密(asymmetric encryption)又称为公钥加密(public keycryptography),它是另一种方
法,使用两个密钥,而不是一个;其中一个密钥是私密的,另一个是公开的. 顾名思义,一个密钥用于
私人,另一个密钥将会被所有人共享。这两个密钥之间存在一些特殊的数学关系,使得密钥具备一些有
用的特性。如果你利用某人的公钥加密数据,那么只有他们对应的私钥能够解密,如图1-5所示。从另一
个方面讲,如果某人用私钥加密数据,任何人都可以利用对应的公钥解开消息. 后面这种操作不提供机密
性,但可以用作数字签名.


非对称加密使得大规模团体的安全通信大幅简化。假设你可以广泛并且安全地分享你的公钥(PKI的工作
将会在第3章中进行讨论),那么任何人都可以向你发送消息,只有你可以阅读。如果他们使用各自的私
钥签名,你还可以精确地知道消息出自何人之手。虽然公钥密码的属性非常有趣,但它却非常缓慢,不适
用于数据量大的场景。因此,它往往被部署于进行身份验证和共享秘密的协商,这些秘密后续将用于快速
的对称加密。

RSA(得名于三个人的姓氏首字母:Ron Rivest、Adi Shamir和LeonardAdleman)是目前最普遍部署的非
对称加密算法[插图]。现在推荐的RSA强度是2048位,强度等同于112位的对称密钥。我将会在本章稍后更
加详细地讨论密码强度。

4.1.6  数字签名

数字签名(digital signature)是一个密码学方案。它使得验证一条电子消息或者一篇电子文档的真实
性成为可能。前面描述的MAC就是一种电子签名,它可以利用事先安全交换的散列密钥验证真实性。虽然
这种校验非常有用,但仍有不足,因为它仍然依赖于一个私有密钥。借助公钥密码,数字签名可以与现实
生活中的手写签名类似。我们可以利用公钥密码的非对称性设计出一种算法,使用私钥对消息进行签名,
并使用对应的公钥验证它。实际的方式依照选择的公钥密码体系而有所不同。下面以RSA为例。RSA可以用
于加密,也可以用于解密。如果使用RSA私钥加密,那么仅能通过对应的公钥解密。我们可以利用这个性
质,并且结合散列函数,实现数字签名。
(1) 计算希望签名的文档的散列。不论输入文档的长度如何,输出长度总是固定的。比如,使用SHA256就是256位;
(2) 对结果散列和一些额外的元数据进行编码。比如,接收方需要知道你使用的散列算法,否则不能处理签名;
(3) 使用私钥加密编码过的数据,其结果就是签名,可以追加到文档中作为身份验证的依据.


为了验证签名,接收方接收文档并使用相同的散列算法独立计算文档散列。接着,她使用公钥对消息进行
解密,将散列解码出来,再确认使用的散列算法是否正确,解密出的散列是否与本地计算的相同。这个方
案的强度取决于加密、散列以及编码组件各自的强度。

注意:
并非所有的数字签名算法都与RSA的工作方式一致。事实上,RSA是一个特例,因为它可以同时用于加密和
数字签名。其他流行的公钥密码算法则不能用于加密,比如DSA和ECDSA,它们依赖其他方式进行签名.

4.1.7  随机数生成

真随机数生成器(true random number generator,TRNG)
伪随机数生成器(pseudorandomnumber generator, PRNG)



TRNG是非常难生成的:
之所以说随机数不易生成,是因为计算机是十分善于预测的,它们会严格按照指令执行。如果告诉它生成
一个随机数,它很可能做不好这项工作。真正的随机数只能通过观测特定的物理处理器才能得到。没有的
话,计算机将关注于收集少量的熵(entropy).这通常意味着监视按键状态、鼠标移动,以及各种外设(比
如硬盘)的交互情况.
通过这种方式收集熵是一种真随机数生成器(TRNG),但是直接使用这种方式并不足够可靠.打个比方,你可
能需要生成一个4096位的密钥,但是系统可能只有数百位的熵可用.如果没有可靠的外部事件可以收集到
足够的熵,系统就可能会停止.



CPRNG:
加密安全伪随机数生成器(cryptographically secure pseudorandom number generator, CPRNG)是不可
预测的PRNG. 这个性质对安全来说非常关键,一定不能让攻击者对观察到的CPRNG输出进行内部状态的逆
向工程.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值