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

加密、摘要、签名、证书,一次说明白!数据安全传输,是一个非常宽泛的话题。HTTPS、文件签名、应用签名等场景背后,其实解决的就是如何安全地传输数据的问题;

这是我参与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,但凡涉及到数据在非安全信道中流转时,就需要应用这些工具来实现数据安全传输。

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


参考资料


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

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

今天的文章加密、摘要、签名、证书,一次说明白!分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/21862.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注