加密、摘要、签名、证书,一次说明白!

12,190 阅读18分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

点赞关注,不再迷路,你的支持对我意义重大!

🔥 Hi,我是丑丑。本文 GitHub · Android-NoteBook 已收录,这里有 Android 进阶成长路线笔记 & 博客,欢迎跟着彭丑丑一起成长。(联系方式 & 入群方式在 GitHub)

前言

  • 数据安全传输,是一个非常宽泛的话题。HTTPS、文件签名、应用签名等场景背后,其实解决的就是如何安全地传输数据的问题;
  • 在这篇文章里,我将带你理解 数据安全传输的基本模型,以及加密、摘要、签名和数字证书的概念与作用。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。

目录


1. 概述

1.1 CIA 三要素

在讨论今天的主题之前,有必要先搞清楚到底什么是安全?在计算机领域,所谓的 “安全” 其实是指 “信息安全”,它的基本含义可以概括为三个要素,简称 CIA 三要素

  • 1、机密性(Confidentiality): 指确保数据在传输和存储过程中的私密性。主要的手段是加密、权限管理和敏感信息脱敏;

  • 2、完整性(Integrity): 指确保数据内容完成,没有被篡改。主要手段是数字签名;

  • 3、可用性(Avaliability): 指确保服务保持可用状态。例如能够承受 Dos 等网络攻击。

1.2 非安全信道的风险

数据需要通过信道进行传输,狭义上的信道是指报纸、有线网络、无线电波等通信媒介,而广义上说,信道可以理解为数据从分发到接收的整个过程。在非安全信道中,主要会面临以下三个安全风险:

  • 1、窃听风险: 现代计算机网络建立在 TCP/IP 协议族提供传输能力上,数据在传输线路上的每个环节都可能被窃听,从而导致敏感数据泄露;

  • 2、篡改风险: 数据在传输过程中可能被篡改,例如中间人攻击。攻击者可以和通信双方分别建立独立的连接,使得通信双方误以为它们正在进行一个私密连接,但察觉不到数据被篡改;

  • 3、伪装风险: 攻击者可以伪装成合法的身份。

1.3 如何实现传输安全?

我们今天的主题 “加密 + 签名 + 证书”,本质上就是在非安全信道中实现数据安全传输的解决方案。要实现数据安全传输,其实就是要高效地解决非安全信道中的三个风险:

  • 1、加密 —— 防窃听 : 将明文转换为密文,只有期望的接收方有能力将密文解密为明文,即使密文被攻击者窃取也无法理解数据的内容;

  • 2、验证完整性 —— 防止篡改: 对原始数据计算摘要,并将数据和摘要一起交付给通信对方。接收方收到后也对数据计算摘要,并比较是否和接受的摘要一致,借此判断接收的数据是否被篡改。不过,因为收到的摘要也可能被篡改,所以需要使用更安全的手段:数字签名;

  • 3、认证数据来源 —— 防止伪装: 数字签名能够验证数据完整性,同时也能认证数据来源,防止伪装。


2. 加密 —— 防窃听

2.1 什么是加密?

加密(Encryption)是将明文(Plaintext)转换为密文(Ciphertext)的过程,只有期望的接收方有能力将密文解密为明文,即使密文被攻击者窃取也无法理解数据的内容。

在古典密码时期,数据保密性取决于算法的保密性,一旦加密算法被破解或泄露,就失去了数据的安全性。而进入现代密码时期,柯克霍夫原则成为加密系统的基本设计原则:数据的安全性基于密钥而不是算法的保密

根据柯克霍夫原则,现代的保密通信模型是基于密钥的保密模型模型。在这个模型中,加密和解密使用相同密钥,就是 对称加密密码体制;反之,加密和解密使用是不同密钥,就是 非对称密码体制。

2.2 对称加密和非对称加密的区别?

  • 1、密钥管理: 对称加密算法中需要将密钥发送给通信对方,存在密钥泄漏风险;非对称加密公钥是公开的,私钥是保密的,防止了私钥外传;

  • 2、密钥功能: 公钥加密的数据,只可使用私钥对其解密。反之,私钥加密的数据,只可使用公钥对其解密(注意:公钥加密的数据无法使用公钥解密,因为公钥是公开的,如果公钥可以解密的话,就失去了加密的安全性);

  • 3、计算性能: 非对称加密算法的计算效率低,因此实际中往往采用两种算法结合的复合算法:先使用非对称加密建立安全信道传输对称密钥,再使用该密钥进行对称加密;

  • 4、认证功能: 非对称加密算法中,私钥只有一方持有,具备认证性和抗抵赖性(第 3 节 数字签名算法 应用了此特性)。

考虑到性能的因素,在 HTTPS 协议中采用的是 “对称加密” 和 “非对称加密” 结合的 “混合加密” 方案:在建立通信时,采用非对称加密的方式来协商 “会话密钥”,在通信过程中基于该密钥进行对称加密通信。

2.3 数据加密标准 —— DES

1977 年,数据加密标准(Data Encryption Standard, DES)成为美国联邦信息处理标准,并逐渐成为事实标准,很多主流的对称加密算法都是从 DES 算法发展过来的。

DES 算法的主要缺点是加密强度和计算性能较差

  • 1、密钥长度太短: DES 算法密钥长度只有 56 bit,理论最大加密长度为 256。随着计算机算力的提高,用穷举法可以在较短时间破解密钥;

  • 2、不能对抗差分和线性密码分析;

  • 3、计算性能较差: 增加 DES 密钥长度,加解密的计算开销呈指数增长。

2.4 高级加密标准 —— AES

高级加密标准(Advanced Encryption Standard, AES),又称 Rijndael [rain-dahl]加密法,是目前最流行的对称加密算法之一。

相对于 DES 算法,AES 算法的主要优点如下:

  • 1、密钥长度更大: 密钥长度最小为 12 bit,最大为 256 bit。用穷举法难以破解;

  • 2、使用 WTS 设计策略,可对抗差分和线性密码分析;

  • 3、计算性能高: 计算和内存开销低,适用于受限设备。

2.5 RSA 算法

1977 年,麻省理工学院的三位教授 Rivest、Shamir 和 Adleman 共同提出了 RSA 加密算法,其中 RSA 分别是他们姓氏的首字母。RSA 是经典的非对称加密算法,同时也是经典的数字签名算法。

RSA 算法的安全性依赖于一个数学难题 —— “大数因式分解”:两个大素数相乘非常容易,但对一个极大整数做因式分解的复杂度极高。如果存在某种快速因素分解的算法,那么 RSA 算法的可靠性将会大大折扣。RSA 算法存在一个系统性风险:“不支持前向加密”。在 RSA 算法中,服务端公钥是相对固定的,一但服务端私钥被破解,则之前所有发送过得加密数据都会被破解。

关于 RSA 算法的原理解析,可参考:浅析 RSA 算法

2.6 DH 算法

DH 算法的安全性依赖于一个数学难题 —— “离散对数”:已知对数计算出真数非常简单,但已知真数求对数的复杂度极高。 如果存在某种求对数的算法,那么 DH 算法的可靠性将会大大折扣。

目前,DH 算法有多种实现,主要区别如下:

  • static DH 算法:一方的私钥是静态的(通常是服务器私钥固定),不具备前向安全性;

  • DHE 算法:双方的私钥都在密钥交换节点随机生成,具备前向安全性;

  • ECDHE 算法:利用 ECC 椭圆曲线特性,可以用更少的计算量计算公钥和私钥。

关于 DH 算法的原理解析,可参考:这 HTTPS,真滴牛逼!

2.7 安全系统中为什么要使用随机数?

在 RSA 算法生成密钥对的过程中,我们需要随机生成两个大素数。事实上,除了在 RSA 算法中,很多安全系统中都需要一个随机数,为什么呢?—— 关键在于随机数不可预测性,可以提高破解和报文重放攻击难度。

2.8 计算机如何生成随机数?

随机数是计算机安全领域中非常重要的一个点,很多场景中都需要一个随机数来生成随机事件,比如密钥的生成、文件名、sessionId/orderId/token 等。现代的随机数生成模型依然采用的是 1946 年冯·诺依曼设计的随机数模型:

1、输入任意一个数作为 “种子”,通过随机数算法得到一个随机数; 2、将生成的随机数作为新的种子,代入下一轮计算; 3、重复 1、2 步骤,就可以生成多个具有统计意义的随机数。

然而,通过这种模型生成的随机数并不是绝对随机的。只要取样范围足够大,随机结果一定会陷入循环,因此这种模型生成的随机数只能称为 “伪随机数”,而随机结果陷入循环的周期称为 “随机周期”

要得到真正意义的随机数,需要硬件层面支持。1999 年 Intel 在其 i810 芯片组上集成了世界上第一款真随机数生成器,它的方案是将电路的热噪声(分子的不规则运动)作为数据来源,缺点是效率太低,因此目前计算机中采用的随机数依旧是软件实现的伪随机数。虽然软件无法做到真随机,但可以提高生成器的随机性。比如采用更强壮的随机算法(Java#SecurityRandom)、采用更复杂的种子(系统时间、鼠标位置、网络速度、硬盘读写速度)、扩大随机数的取值范围、组合多个随机算法等。


3. 数字签名 —— 验证完整性 & 认证数据来源

3.1 什么是数字签名?

数字签名(Digital Signature)也叫作数字指纹(Digital Fingerprint),它是消息摘要算法和非对称加密算法的结合体,能够验证数据的完整性,并且认证数据的来源

数据签名算法的模型分为两个主要阶段:

  • 1、签名: 先计算数据的 [摘要],再使用私钥对 [摘要] 进行加密生成 [签名],将 [数据 + 签名] 一并发送给接收方;
  • 2、验证: 先使用相同的摘要算法计算接收数据的 [摘要],再使用预先得到的公钥解密 [签名],对比 [解密的签名] 和 [计算的摘要] 是否一致。若一致,则说明数据没有被篡改。

提示: 接收方如何安全地预先得到发送方的公钥,见 第 4 节

3.2 为什么数字签名可以验证完整性?

验证完整性主要依赖于消息摘要算法的特性,摘要算法的原理是根据一定的运算规则提取原始数据中的信息,被提取的信息就是原始数据的消息摘要,也称为数据指纹。著名的摘要算法有 MD5 算法和 SHA 系列算法。

摘要算法具有以下特点:

  • 一致性: 相同数据多次计算的摘要是相同的,不同的数据(在不考虑碰撞时)的摘要是不同的;
  • 不可逆性: 只能正向提取原始数据的摘要,无法从摘要反推出原始数据;
  • 高效性: 摘要的生成过程高效快速;

摘要算法的模型分为两个主要步骤:

  • 生成摘要: 先计算数据的 [摘要],再将 [数据 + 摘要] 一并发送给接收方;
  • 验证摘要: 使用相同的摘要算法计算接收数据的 [摘要],对比 [收到的摘要] 与 [计算的摘要]是否一致。若一致,则说明数据是完整的。

需要注意的是,单纯依靠摘要算法不能严格地验证数据完整性。因为在非安全信道中,数据和摘要都存在篡改风险,攻击者在篡改数据时也可以篡改摘要。因此,摘要算法需要配合加密算法才能严格验证完整性。

3.3 为什么数字签名可以认证数据来源?

这是因为签名时引入了发送方的私有信息(私钥),只有 ”合法的发送方“ 才能产生其他人无法伪造的一段数字签名(加密字符串),这个数字签名就证明了数据的真实来源。当接收方采用 ”合法途径“ 获得发送方的公有信息是(公钥),并且成功验证数字签名,那么正说明数据来自 ”合法的接收方“。

另外,在签名时引入发送方私有信息,在验证时使用发送方公有信息,这正好符合 “非对称加密” 的特点。因此签名时引入的私有信息正是私钥,验证时使用的公有信息正式公钥。

3.4 摘要算法存在碰撞,是不是不安全?

摘要算法(散列算法)本质上是一种 压缩映射,因此一定存在不同原始数据映射到同一个散列值的情况,这就是发生了碰撞(散列冲突,Hash Collision)。事实上,MD5、SHA-1 等散列算法已经陆续被找到快速散列碰撞的的方法,攻击者可以构造内存篡改但摘要一致的文件从而绕过检查。但不代表完全不安全,因为篡改为有价值的伪造内容还有困难??

3.5 为什么摘要中需要加盐?

为了提高安全性,在对原始数据生成摘要之前,我们往往会先向原始数据中加盐,再生成摘要。为什么要这么做呢?

这是为了避免 “彩虹表(Rainbow tables)” 攻击,提高简单数据的安全性。因为摘要算法有一致性的特点,相同数据多次计算的摘要是相同的。利用这个特性,攻击者可以预先生成一系列简单数据的摘要,并存储 “摘要 - 数据” 的映射,这个映射关系就是彩虹表。在获取到数据摘要后,如果发现摘要存在彩虹表中,就可以轻易地反推出原始数据。

用户在设置密码时,也要避免使用 123456 这种简单密码,因为容易被彩虹表攻击破解。为了提高安全性,在传输手机号、密码等敏感信息的过程中,往往会在原始密码中加盐。

3.6 可以先使用私钥对原数据签名,再对签名进行摘要吗?

不可以,主要有两个原因:

  • 1、可行性: 接收方需要通过摘要验证数据完整性,然而接收方无法对数据进行签名,因此无法验证数据摘要一致性;

  • 2、时间效率: 对原始数据进行签名(加密)时间太长,而摘要算法本身是压缩映射,可以缩短签名消耗的时间。


4. 数字证书 —— 安全地发放公钥

第 3 节 中,我们提到接收方需要使用发送方的公钥来验证数据真实性。那么,接收方怎样才能安全地获得发送方公钥呢?这就需要数字证书来保证。

4.1 什么是数字证书?

数字签名和数字证书总是成对出现,二者不可分离。数字签名主要用来验证数据完整性和认证数据来源,而数字证书主要用来安全地发放公钥。 数字证书主要包含三个部分:用户的信息、用户的公钥和 CA 对该证书实体信息的签名

数字证书的模型主要分为两个步骤:

  • 1、颁发证书:

    • 1.1 申请者将签名算法、公钥、有效时间等信息发送给 CA 机构;
    • 1.2 CA 机构验证申请者身份后,将申请者发送的信息打成一个实体,并计算摘要;
    • 1.3 CA 机构使用自己的私钥对摘要进行加密,生成证书签名(Certificate Signature);
    • 1.4 CA 机构将证书签名添加在数字证书上,构成完整的数字生出。
  • 2、验证证书

    • 2.1 验证方使用相同的摘要算法计算证书实体的摘要;
    • 2.2 使用 CA 机构的公钥(浏览器和操作系统中集成了 CA 的公钥信息)解密证书签名;
    • 2.3 对比解密后的数据与计算的摘要是否一致,如果一致则是可信任的证书。

4.2 什么是证书颁发机构 CA?

证书颁发机构(certifcation authroity, CA)是负责数字证书的审批、颁发、归档和吊销等功能的机构,具有权威性。CA 机构分为 “根 CA” 和 “中间 CA”,原则上要避免根 CA 机构直接颁发最终实体证书,而需要由中间 CA 机构颁发最终实体证书。这是为了避免证书失效的影响范围,一旦根证书失效或被伪造,那么整个证书链都有问题。

4.3 什么是证书链?

证书链是多个数字证书建立的的证书验证链条。数字证书主要包含三个部分:用户信息、用户密钥以及 CA 机构对该证书实体的签名。为了验证证书实体的合法性,需要获得颁发该证书的 CA 机构公钥,这个公钥就存在于上一级证书中。因此,为了验证证书的合法性,就需要沿着证书链向上追溯直到根证书为止。

根证书是自签名证书,用户下载根证书就表示信任该根证书所有签发的证书。在操作系统或浏览器中,已经内置了一部分受信任的根证书。

4.4 数字证书的标准

数字证书主要包含三个部分:用户的信息、用户的公钥和 CA 对该证书实体信息的签名。目前的数字证书采用的是公钥基础设施(PKI)制定的 X.509 标准,目前已经有 3 个版本,其中比较常见的是 X.509 第三版的标准。主要格式如下:

字段描述
版本 (Version)证书的版本信息
序列号 (Serial Number)证书的唯一标识
签名算法标识 (Hash)证书签名采用的算法
有效期 (Validity)证书有效期的开始日期和结束日期
持有者信息 (Subject)证书的持有者
公钥 (Subject Public Key Info)持有者构建的公共密钥
颁布者信息 (Issuer)证书颁布者
签名 (Certificate Signature)颁布者对证书实体的签名

5. 总结

看到这里,你应该已经建立起数据安全传输的基本认知。大多数情况,我们是在讨论 HTTPS 协议时才会遇到加密、摘要、签名和证书等概念。事实上,这些概念不止于 HTTPS,但凡涉及到数据在非安全信道中流转时,就需要应用这些工具来实现数据安全传输。

后面,我会写一些文章,在更多具体场景中讨论数据安全传输,请关注~ 更多文章:


参考资料


创作不易,你的「三连」是丑丑最大的动力,我们下次见!