目录

  1. 概述
  2. 密码
  3. 密钥
  4. 对称密钥加密系统
    1. 密钥长度攻击与密钥枚举攻击
    2. 共享密钥
  5. 公开密钥加密技术
    1. RSA
    2. 混合加密系统和会话密钥
  6. 数字签名
    1. 什么是签名
  7. 数字证书
    1. 证书的主要内容
    2. X.509 v3 证书
    3. 用证书对服务器进行认证
  8. 附录

本文主要是对一个加密环境的基本构造进行阐述,展示安全性从何而来。同样,还会讨论加密体系通常是如何受到攻击的

概述

密码学是一门通信安全的科学,同时也是一门艺术。在上千年以前,人们事实上就已经开始利用密码学的力量了。我们今天所知的密码学诞生于 20 世纪,用于军事领域;而它现在已经成为了我们日常生活的一部分

❓什么是密码学?

密码学是对报文进行编/解码的机制与技巧。人们用加密的方式来发送秘密信息已经有数千年了,但密码学所能做的不仅仅是加密报文以防止好事者的读取,我们还可以用它来防止对报文的篡改,甚至还可以用密码学来证明某条报文或某个事务确实出自你手,就像支票上的手写签名或信封上的压纹封蜡一样

部署正确的密码能解决安全的三个核心需求:保持秘密(机密性)验证身份(真实性),以及保证传输安全(完整性)

❓什么是数字密码?

随着数字计算的出现,出现了以下两个主要的进展:从机械设备的速度和功能限制中解放出来,使复杂的编/解码算法成为可能支持超大密钥成为可能,这样就可以从一个加密算法中产生出数万亿的虚拟加密算法,由不同的密钥值来区分不同的算法。密钥越长,编码组合就越多,通过随机猜测密钥来破解代码就越困难

现代的加密算法通常都设计为:即使大家都知道加密算法,恶意的攻击者也很难发现任何有助于破解代码的模式,通常进行一种基于攻击者算力的假设

密码

❓什么是密码?

密码学基于一种名为密码(cipher)的秘密代码。密码是一套编码方案,一种特殊的报文编码方式和一种稍后使用的相应解码方式的结合体。加密之前的原始报 文通常被称为明文(plaintext 或 cleartext)。使用了密码之后的编码报文通常被称作 密文(ciphertext)

密钥

❓ 什么是数字密钥?

与金属钥匙或机械设备中的号盘设置相比,数字密钥只是一些数字。这些数字密钥值是编 / 解码算法的输入。编码算法就是一些函数,这些函数会读取一块数据,并根据算法和密钥值对其进行编 / 解码

对称密钥加密系统

很多数字加密算法都被称为对称密钥(symmetric-key)加密技术,这是因为它们在编码时使用的密钥值和解码时一样,将这个统一密钥称为 k 。在对称密钥加密技术中,发送端和接收端要共享相同的密钥 k 才能进行通信;发送端用共享的密钥来加密报文,并将得到的密文发送给接收端。接收端收到密文,并对其应用解密函数和相同的共享密钥,恢复出原始的明文

流行的对称密钥加密算法包括:DES、Triple-DES、RC2 和 RC4

密钥长度攻击与密钥枚举攻击

保持密钥的机密状态是很重要的。在很多情况下,编 / 解码算法都是众所周知的,因此密钥就是唯一保密的东西了。好的加密算法会迫使攻击者试遍每一个可能的密钥,才能破解代码。用暴力去尝试所有的密钥值称为枚举攻击(enumeration attack)。如果只有几种可能的密钥值,居心不良的人通过暴力遍历所有值,就能最终破解代码了。但如果有大量可能的密钥值,他可能就要花费数天、数年,甚至无限长的时间来遍历所有的密钥,去查找能够破解密码的那一个

其中可用密钥值的数量取决于密钥中的位数,以及可能的密钥中有多少是有效的。有些加密技术中只有部分密钥值是有效的。比如,最知名的非对称密钥加密系统 RSA 中,有效密钥必须以某种方式与质数相关。可能的密钥值中只有少量密钥具备此特性。在传统的对称密钥加密技术中,对小型的、不太重要的事务来说,40 位的密钥就足够安全了。但现在的高性能服务器可以将其破解。

相比之下,对于对称密钥加密技术,128 位的密钥被认为是非常强大的。实际上,长密钥对密码安全有着非常重要的影响,美国政府甚至对使用长密钥的加密软件实施了出口控制,以防止潜在的敌对组织创建出美国国家安全局(National Security Agency,NSA)自己都无法破解的秘密代码

但是,长的密钥并不意味着可以高枕无忧了!加密算法或实现中可能会有不为人注意的缺陷,为攻击者提供了可攻击的弱点。攻击者也可能会有一些与密钥产生方式有关的信息,这样他就会知道使用某些密钥的可能性比另一些要大,从而有助于进行有目的的暴力攻击。或者用户可能将保密的密钥落在了什么地方,被攻击者偷走了

共享密钥

对称密钥加密技术的缺点之一就是发送者和接收者在互相对话之前,一定要有一个共享的保密密钥

比如 Alice(A)、Bob(B)和 Chris(C)都想与 Joe 的五金商店(J)对话。A、B 和 C 都要建立自己与 J 之间的保密密钥。A 可能需要密钥 $K_{AJ}$,B 可能需要密钥 $K_{BJ}$,C 可能需要密钥 $K_{CJ}$。每对通信实体都需要自己的私有密钥。如果有 N 个节点,每个节点都要和其他所有 N-1 个节点进行安全对话,总共大概会有 $N^2$ 个保密密钥:这将是一个管理噩梦

公开密钥加密技术

公开密钥加密技术没有为每对主机使用单独的加密 / 解密密钥,而是使用了两个非对称密钥:一个用来对主机报文编码,另一个用来对主机报文解码。编码密钥是众所周知的(这也是公开密钥加密这个名字的由来),但只有主机才知道私有的解密密钥,每个人都能找到某个特定主机的公开密钥,使得密钥的建立变得更加简单,因此只有接收端才能对发送给它的报文进行解码

公开密钥加密技术是非对称的,为编码和解码使用了不同的密钥,节点 X 可以将其加密密钥 ex 公之于众,任何想向节点 X 发送报文的人都可以使用相同的公开密钥了。因为每台主机都分配了一个所有人均可使用的编码密钥,所以公开密钥加密技术避免了对称密钥加密技术中成对密钥数目的 $N^2$ 扩展问题

大部分公开密钥查找工作实际上都是通过数字证书来实现的。尽管每个人都可以用同一个密钥对发给 X 的报文进行编码,但除了 X,其他人都无法对报文进行解码,因为只有 X 才有解码的私有密钥 dx 。将密钥分隔开来可以让所有人都能够对报文进行编码,但只有其所有者才能对报文进行解码。这样,各节点向服务器安全地发送报文就更加容易了,因为它们只要查找到服务器的公开密钥就行了

通过公开密钥加密技术,全球所有的计算机用户就都可以使用安全协议了。制定标准化的公开密钥技术包是非常重要的,因此,大规模的公开密钥架构标准创建工作已经开展十多年了

RSA

所有公开密钥非对称加密系统所面临的共同挑战是,要确保即便有人拥有了下面所有的线索,也无法计算出保密的私有密钥:

  • 公开密钥(是公有的,所有人都可以获得)
  • 一小片拦截下来的密文(可通过对网络的嗅探获取)
  • 一条报文及与之相关的密文(对任意一段文本运行加密器就可以得到)

RSA 算法就是一个满足了所有这些条件的流行的公开密钥加密系统,即使有了公共密钥、任意一段明文、用公共密钥对明文编码之后得到的相关密文、RSA 算法自身,甚至 RSA 实现的源代码,破解代码找到相应的私有密钥的难度仍相当于对一个极大的数进行质因数分解的困难程度,这种计算被认为是所有计算机科学中最难的问题之一

混合加密系统和会话密钥

任何人只要知道了其公开密钥,就可以向一台公共服务器发送安全报文,所以非对称的公开密钥加密系统是很好用的。两个节点无须为了进行安全的通信而先交换私有密钥。

但公开密钥加密算法的计算可能会很慢。实际上它混合使用了对称和非对称策略。比如,比较常见的做法是在两节点间通过便捷的公开密钥加密技术建立起安全通信,然后再用那条安全的通道产生并发送临时的随机对称密钥,通过更快的对称加密技术对其余的数据进行加密。

数字签名

除了加 / 解密报文之外,还可以用加密系统对报文进行签名(sign),以说明是谁编写的报文,同时证明报文未被篡改过。这种技术被称为数字签名(digital signing)

什么是签名

数字签名是附加在报文上的特殊加密校验码。使用数字签名有以下两个好处:

  • 签名可以证明是作者编写了这条报文。只有作者才会有最机密的私有密钥,因此,只有作者才能计算出这些校验和。校验和就像来自作者的个人“签名”一样。
  • 签名可以防止报文被篡改。如果有恶意攻击者在报文传输过程中对其进行了修改,校验和就不再匹配了。由于校验和只有作者保密的私有密钥才能产生,所以攻击者无法为篡改了的报文伪造出正确的校验码。

数字签名通常是用非对称公开密钥技术产生的。因为只有所有者才知道其私有密钥,所以可以将作者的私有密钥当作一种「 指纹 」使用

在接收端,如果节点 B 需要确定报文确实是节点 A 写的,而且没有被篡改过,节点 B 就可以对签名进行检查。节点 B 接收经私有密钥扰码的签名,并应用了使用公开密钥的反函数。如果拆包后的摘要与节点 B 自己的摘要版本不匹配,要么就是报文在传输过程中被篡改了,要么就是发送端没有节点 A 的私有密钥(也就是说它不是节点 A)

数字证书

本节将介绍因特网上的「 ID 卡 」——数字证书。数字证书中包含了由某个受信任组织担保的用户或公司的相关信息。

我们每个人都有很多形式的身份证明。有些 ID,比如护照和驾照,都足以在很多场合证明某人的身份。

证书的主要内容

数字证书中还包含一组信息,所有这些信息都是由一个官方的「 证书颁发机构 」以数字方式签发的。基本的数字证书中通常包含一些纸质 ID 中常见的内容,比如:

  • 对象的名称(人、服务器、组织等);
  • 过期时间;
  • 证书发布者(由谁为证书担保);
  • 来自证书发布者的数字签名

而且,数字证书通常还包括对象的公开密钥,以及对象和所用签名算法的描述性信息。任何人都可以创建一个数字证书,但并不是所有人都能够获得受人尊敬的签发权,从而为证书信息担保,并用其私有密钥签发证书。

X.509 v3 证书

不幸的是,数字证书没有单一的全球标准。就像不是所有印刷版 ID 卡都在同样的位置包含了同样的信息一样,数字证书也有很多略有不同的形式。 不过好消息就是现在使用的大多数证书都以一种标准格式——X.509 v3,来存储它们的信息。X.509 v3 证书提供了一种标准的方式,将证书信息规范至一些可解析字段中。不同类型的证书有不同的字段值,但大部分都遵循 X.509 v3 结构。表 14-2 介绍了 X.509 证书中的字段信息

基于 X.509 证书的签名有好几种,(其中)包括 Web 服务器证书、客户端电子邮件证书、软件代码签名证书和证书颁发机构证书

用证书对服务器进行认证

通过 HTTPS 建立了一个安全 Web 事务之后,现代的浏览器都会自动获取所连接服 务器的数字证书。如果服务器没有证书,安全连接就会失败。服务器证书中包含很多字段,其中包括:

  • Web 站点的名称和主机名;
  • Web 站点的公开密钥;
  • 签名颁发机构的名称;
  • 来自签名颁发机构的签名。

浏览器收到证书时会对签名颁发机构进行检查,浏览器和其他因特网应用程序都会尽量隐藏大部分证书管理的细节,使得浏览更加方便。但通过安全连接进行浏览时,所有主要的浏览器都允许你自己去检查所要对话站点的证书,以确保所有内容都是诚实可信的。

如果这个机构是个很有权威的公共签名机构,浏览器可能已经知道其公开密钥了,如果对签名颁发机构一无所知,浏览器就无法确定是否应该信任这个签名颁发机构,它通常会向用户显示一个对话框,看看他是否相信这个签名发布者。签名发布者可能是本地的 IT 部门或软件厂商。

附录