第一章 SSL、TLS和密码学

所有连接到互联网的设备都有一个共同点,它们依赖安全套接字层(secure socket layer,SSL) 和传输层安全(transport layer security,TLS)协议保护传输的信息。

如果部署了加密,攻击者也许有能力得到加密数据的访问权限,但是不能解密数据或者篡改 数据。为了避免伪装攻击,SSL和TLS依赖另外一项被称为公钥基础设施(public keyinfrastructure,PKI)的重要技术,确保将流量发送到正确的接收端。

它用于TCP协议之上,上层协议 (如HTTP)之下。当不需要加密时,可以将TLS从模型中去掉,这并不会对上层协议产生影响(它 们将直接与TCP协同工作)。当需要加密时,就可以利用TLS加密HTTP,以及其他TCP协议(比 如SMTP、IMAP等)

协议历史

2014年10月,Google发布在SSL 3.0中发现设计缺陷,建议禁用此一协议。攻击者可以向TLS发送虚假错误提示,然后将安全连接强行降级到过时且不安全的SSL 3.0,然后就可以利用其中的设计漏洞窃取敏感信息。Google在自己公司相关产品中陆续禁止回溯兼容,强制使用TLS协议。Mozilla也在11月25日发布的Firefox 34中彻底禁用了SSL 3.0。微软同样发出了安全通告[9]

TLS 1.0[编辑]

IETF将SSL标准化,即 RFC 2246 ,并将其称为TLS(Transport Layer Security)。

TLS 1.1

微软、Google、苹果、Mozilla四家浏览器业者将在2020年终止支持TLS 1.0及1.1版[12]。2021年3月,RFC 8996标准弃用了TLS 1.0和TLS 1.1[4]

TLS 1.2

所有TLS版本在2011年3月发布的RFC 6176中删除了对SSL的兼容,这样TLS会话将永远无法协商使用的SSL 2.0以避免安全问题。

密码学--构建基元

一个加密环境的基本构造进行讨论,展示安全性从何而来

加密体系通常是如何受到攻击的

将视角保持在很宽泛的层面上,给大家介绍一些基础知识

在最底层,使用密码加密依赖于各种加密基元(cryptographic primitive)

每种基元都着眼于 某个特定功能而设计。

我们会使用某个基元加密,使用另外一个基元进行完整性检查。

单个基元本身的作用并不大,但是我们可以将它们组合成方案(scheme)和协议(protocol),从而 提供可靠的安全性。

明文(plaintext,即原始数据)、密钥(cipher, 用于加密)和密文(ciphertext,即加密后的数据)

1、对称加密

古老的加密案例:

比如,加密时将字母表中的每个字母替换成其他字母,解 密时反向操作,这就是代替密码加密。在这个例子中,不存在密钥;安全性取决于保守加密方法 的秘密

加密算法 + 密钥 

        1、如果加密算法优秀,攻击者只有一种方法,那就是尝试所有可能的解码 密钥,俗称穷举密钥搜索(exhaustive key search)。

        2、密文的安全性完全取决于密钥。如果密钥是从某个非常大的密钥空 间中选取出来的,那么破解也需要遍历所有这些可能的密钥,其数量极大,几乎不可能。我们可 以说这种算法在计算上是安全性的

        3、通常我们通过密钥长度来衡量加密强度;有一个假设是,密钥本质上是随机的,所以 密钥空间才可以由密钥的位数来定义

        4、密码可以分为两大类:序列密码和分组密码。

序列密码

从概念上讲,序列密码(stream cipher)的操作过程与我们想象中加密的过程一致。将1字节 的明文输入加密算法,就得到1字节的密文输出。在对端则进行相反的过程。整个过程持续重复, 直到所有数据处理完成。

RC4是最为人熟知的序列密码①。因为它很快很简单,所以一度非常流行。但是它已经不再 安全。我将在7.5节中讨论它的弱点。其他现代的安全序列密码则由ECRYPT Stream Cipher Project②进行推进。

分组密码

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

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

分组密码的挑战之一是处理数据长度小于加密块大小的数据加密。举个例子,128位的AES需要16字节的输入数据并且产出相同长度的输出。如果你的数据刚好能归入16字节的块中,那正 好。但如果不足16字节,怎么办?一种方法是追加额外的数据到明文的尾部。这些额外的数据就 被称为填充(padding)。

2、散列函数

散列函数(hash function)是将任意长度的输入转化为定长输出的算法。散列函数的结果经 常被简称为散列(hash)

散列函数最常用的使用场合是以紧凑的方式表示并比较大量数据。比如,为了避免直接比较 两个文件(可能很难,比方说,它们存放于世界上不同的位置),你可以比较它们的散列。散列 函数经常被称为指纹、消息摘要,或者简单称为摘要。

散列函数可以用于验证数据完整性,但仅在数据的散列与数据本身分开传输的条件下如此。

3、消息验证代码

消息验证代码(message authentication code,MAC)或者使用密钥的散列(keyed-hash)是以身份验证扩展了散列函数的 密码学函数。只有拥有散列密钥,才能生成合法的MAC。

4、分组密码模式

分组密码模式是为了加密任意长度的数据而设计的密码学方案,是对分组密码的扩展

它有许多输出模式,通常以首字母缩写来引用:ECB、CBC、CFB、OFB、CTR、GCM,诸 如此类

ECB是设计一种分组 加密模式的反面例子,

而CBC则仍是SSL和TLS的主要模式。

GCM是TLS中相对较新的模式,从1.2版本开始才能使用。它提供了机密性和完整性,是当前可用的最好模式。

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

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

5、非对称加密

非对称加密(asymmetric encryption)

使用两个密钥,而不是一个;其中一个密钥是私密的,另一个是公开的。

这两个密钥之间存在一些特殊的数学关系,使 得密钥具备一些有用的特性。

你利用某人的公钥加密数据,那么只有他们对应的私钥能够解密。

如果某人用私钥加密数据,任何人都可以利用对应的公钥 解开消息。这种操作不提供机密性,但可以用作数字签名。

RSA(得名于三个人的姓氏首字母)是目前最普遍部署的非对称加密算法①。现在推荐的RSA强度是2048位,强度等同于112位的对称密钥。

公钥密码的属性非常有趣,但它却非常缓慢,不适用于数据量大的场景。

它往往 被部署于进行身份验证和共享秘密的协商,这些秘密后续将用于快速的对称加密。

6、数字签名

数字签名(digital signature)是一个密码学方案。

借助公钥密码,数字签名可以与现实生活中的手写签名类似。我们可以利用公钥密码的非对 称性设计出一种算法,使用私钥对消息进行签名,并使用对应的公钥验证它。

7、随机数生成

在密码学中,所有的安全性都依赖于生成随机数的质量。

安全性构 建于已知的算法和未知的密钥之上

密钥最简单的形式就是非常长的随机数

计算机是十分善于预测的,它们会严格按照指令执行。如果告诉它生成一个随机数,它很可能做不好这项工作。

计算机将关注于收集少量的熵(entropy)。这通常意味着监视按键 状态、鼠标移动,以及各种外设(比如硬盘)的交互情况。

通过这种方式收集熵是一种真随机数生成器(true random number generator,TRNG),但是直接使用这种方式并不足够可靠。打个比方,你可能需要生成一个4096位的密钥,但是系统可能 只有数百位的熵可用。如果没有可靠的外部事件可以收集到足够的熵,系统就可能会停止。

我们在实际使用中依靠的是伪随机数生成器(pseudorandom number generator,PRNG)。

当然,PRNG也要利用少量真正的随机数使系统运转起来。这个过程被称为种子设定(seeding)。

利用种子,PRNG根据需要构造出无限数量的伪随机数。

普通用途的PRNG被常常用于编程,但它们并不适用于密码学,尽管其输出看起来就是随机的。

加密安全伪随机数生成器(cryptographically secure pseudorandom number generator,CPRNG)是不可预测的PRNG。

密码学--协议

加密基元本身其实没什么用,诸如加密和散列算法。我们只有将这些元素组合成方案和协议, 才能满足复杂的安全需求。

密码学--攻击

复杂系统往往会受到多种方式的攻击,密码系统也不例外。

如果密钥很短,攻击者可以暴力破解。这种攻击通常需要相当多的运算能力和时间。

如果系统使用的基元存在已知缺陷,他就可以使用解析攻击,从而更简单、更快地达成攻击目标。

但不论是基元还是方案,都比协议更安全。因为协议引入了更多的复杂 性,并且攻击界面也大得多。

此外,也存在针对协议实现(implementation)的攻击;换言之,就是利用软件的bug。

我们通常会说加密被绕过,而不是被攻击。这句话意味着使用的基元都很坚实,但软 件体系不牢固。

密码学--衡量强度

我们使用攻破某个基元所需执行的操作数量衡量密码系统的强度,以安全位数来表示。

大部分系统部署128位(2128次操作)就足够了;如果需要长期的安全或者较大的安全宽限期,则使用256位。

对称密码系统的强度按位数增加以几何基数增长,这意味着密码增加1位,强度翻一倍

实际上安全性是一个与时间 相关的函数。加密的强度会随时间发生变化,这是因为随着时间的推移,计算机会更快、更便宜。

安全性同时也是与资源相关的函数。一个短密钥对个人来说可能不可破解,但专业代理机构就可 以达成破解目标。

密码学--中间人攻击

针对传输层安全性的攻击绝大多数来自中间人(man-in-the-middle,MITM)攻击。这意味 着除了会话双方的两个团体,还存在一个恶意团体。

. 取得访问权

在很多案例中,攻击者需要接近受害人或服务器,或者取得通信设施的访问权。

ARP欺骗

地址解析协议(address resolution protocol,ARP)用于在局域网中将MAC地址④与IP地址进 行关联。进入网络的攻击者可以声明任何IP地址,并对网络流量进行有效的重路由。

WPAD劫持

浏览器使用Web代理自动发现协议(web proxy auto-discovery protocol,WPAD)自动获取HTTP

代理的配置。WPAD使用了好几种方法,包括DHCP和DNS。为了攻击WPAD,攻击者在局域网 中启动一台服务器并将其通知到那些寻找服务的本地客户端。

DNS劫持

只要攻击者能通过注册或者改变DNS配置来劫持某个域名,就可以劫持访问这个域名的所有 流量。DNS缓存中毒 DNS缓存中毒(DNS cache poisoning)是一种攻击者利用DNS缓存服务器的缺陷在缓存中注 入非法域名信息的攻击方式。成功完成这种攻击以后,受影响的DNS服务器的所有用户都将收到 攻击者构造的非法信息。

BGP路由劫持

边界网关协议(border gateway protocol,BGP)是一种互联网骨干网络用于发现如何精确定 位IP地址段的路由协议。如果某个非法路由信息被一个或更多路由器所接受,所有通往某个特定IP地址段的流量都将被重定向到另一处,即攻击者那里。

如果攻击者只是监听双方的会话,我们称之 为被动网络攻击(passive network attack)。

  1. 被动攻击对于未加密的流量最为有用。
  2. 被动攻击的效果非常好,这既是因为还有非常多的数据未被加密,也是因为大量收集信息的 过程可以全自动化。
  3. 即使针对加密数据,被动攻击仍可以作为全局策略的一个要素发挥作用。比如,可以先保存 抓取的加密数据,直到破解加密之后再使用。
  4. 为了应对这些,IETF宣布“渗透监听就是攻击”,需要尽可能使用加密进行防御。

如果攻击者主动改变数据流或者影响双方会话,我们 则称之为主动网络攻击(active network attack)。

  • MITM攻击时,指的基本上都是主动攻击
  • 主动攻击最可能用于攻击高价值的个人目标。
  • 主动攻击无法实现自动化,这 意味着它们需要额外的工作,消耗很大,也因此更难以证明其价值。
  •  NSA在一个名为QuantumInsert①的项目中部署了一套庞大的设施,可以用来攻击 互联网上的几乎任意主机。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值