这是我参与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,但凡涉及到数据在非安全信道中流转时,就需要应用这些工具来实现数据安全传输。
后面,我会写一些文章,在更多具体场景中讨论数据安全传输,请关注~ 更多文章:
- 在构建 Android Apk 时,需要进行应用签名。看完这篇文章后,你现在能说清楚应用签名的作用吗?具体分析:他山之石,可以攻玉!一篇文章看懂 v1/v2/v3 签名机制
参考资料
- HTTPS 权威指南 —— 伊万 · 里斯蒂奇 著
- 趣谈网络协议 · HTTPS 协议 —— 刘超 著,极客时间出品
- 图解 HTTP(第 7、8 章)—— 上野宜 著
- Java 加密与解密的艺术 —— 梁栋 著
- 图解网络 —— 小林coding 著
- VasDolly 实现原理 —— 腾讯 VasDolly 技术团队 著
- HTTP 权威指南(第 12、13 章) —— [美] David Gourley,Brian Totty 等著
创作不易,你的「三连」是丑丑最大的动力,我们下次见!
今天的文章加密、摘要、签名、证书,一次说明白!分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/21862.html