前言
- 在分析 HTTPS 协议 时,会涉及到数据安全传输的问题。其实不止 HTTPS,在很多场景下都会遇到数据安全传输的问题,例如 应用签名 等。
- 在这篇文章里,我将带你从全局看待数据安全传输的原理,包括数据安全传输的 三个要求(加密 & 认证 & 验证完整性)和对应的安全技术。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。
系列文章
相关文章
目录
1. 密码学概述
1.1 密码学发展的重要节点
时间 | 事件 | 描述 |
---|---|---|
古典密码学 | / | 保密性依赖于算法的保密性,如果加密算法泄露,则立即失去保密性 |
19世纪 | 柯克霍夫原则(Kerckhoffs'Principle) | 系统的安全性取决于密钥,密钥保密,而加密算法公开 |
/ | 对称密码体制 | 加密和解密使用相同密钥 |
1976年 | 非对称密码体制 / 公开密钥密码体制 | 加密和解密使用是不同密钥 |
1999年 | 破解了 DES 密钥 | 电子前沿基金会 |
2004年 | 实现了 MD5 碰撞 | 王小云教授 |
2005年 | 实现了 SHA-1 碰撞 | 王小云教授 |
2008年 | 伪造了 SSL 证书 | 荷兰埃因霍芬技术大学的科研人员通过 MD5 碰撞,生成了伪造的 SSL 证书,这使得在 HTTPS 协议中服务器可以伪造一些根 CA 的签名 |
1.2 非安全信道的问题
- 防止窃听 —— 加密(通道加密或内容加密)
- 防止篡改 —— 验证完整性
- 防止伪装 —— 认证
1.3 保密通信模型
根据柯克霍夫原则,现代的保密通信模型是基于密钥的保密模型模型。在这个模型中,加密和解密使用相同密钥,就是对称加密密码体制;反之,加密和解密使用是不同密钥,就是非对称密码体制。
2. 消息摘要算法(验证完整性)
这一节我们来讨论消息摘要算法,这一类算法常用于验证数据的完整性,是 第 5 节 数字签名算法 的核心算法。
2.1 概述
消息摘要(Message Digest)算法的本质是散列算法,关于散列算法在我之前写过的一篇文章里讲过:《密码学 | 什么是散列算法?》。散列算法有很多,但是都要满足以下性质 & 要求:
性质 | 描述 |
---|---|
单向性 | 通过散列值无法反推输入数据 |
一致性 | 同一个输入数据,计算后的散列值总是相同的 |
高效性 | 散列运算过程尽量快速 & 高效 |
随机性 | 散列值在输出值域的分布尽量随机 |
输入敏感性 | 相似的数据,计算后的散列值差别很大 |
正是因为消息摘要的 单向性、一致性 的特点,使得它可以验证消息 & 数据的完整性,即数据从产生到接受的整个过程中没有被篡改。
2.2 消息摘要 & 验证模型
下面是一个极简的消息摘要生成 & 验证模型:
- 1、发送方使用消息摘要算法生成摘要
- 2、发送方将消息与消息摘要发送给接收方(注意,若通过不安全信道,则消息和消息摘要可能被监听并篡改)
- 3、接收方收到消息后,使用相同的消息摘要算法生成摘要
- 4、接收方验证两个摘要是否相同
2.3 算法实现
消息摘要算法的具体实现可以分为 MD、SHA 和 MAC 三大类。Editting...
3. 对称加密算法(保密性)
3.1 概述
对称加密指的是 加密和解密使用相同密钥 的加密算法,这一类算法虽然在安全性上比不上非对称加密,却在加密 / 解密速度上占优。
3.2 对称加密模型
3.3 算法实现
举例:DES、DESede、AES、IDEA 和 PBE
Editting...
4. 非对称加密算法(保密性)
4.1 概述
非对称加密指的是 加密和解密使用是不同密钥 的加密算法,公开的密钥叫公钥,保密的密钥叫私钥,所以非对称加密又称为公钥加密算法 / 双钥加密算法。
相对于对称加密算法,核心区别如下:
- 1、解决了对称加密算法中的密钥分配问题,防止了私钥外传
- 2、公钥加密的数据,只可使用私钥对其解密。反之,私钥加密的数据,只可使用公钥对其解密
- 3、加密 / 解密效率远远低于对称加密算法。
- 4、私钥只有发送方持有,具备认证性 / 抗否认性(第 5 节 数字签名算法 应用了此特性)。
提示: 由于非对称加密算法的加密 / 解密效率低,实际中往往采用对称加密结合非对称加密的复合方法。
4.2 非对称加密模型
4.3 算法实现
非对称密码算法的安全性完全依赖于基于计算复杂度上的难题,通常来自于数论。Editting...
举例:
RSA —— 整数因子分解问题;
DSA —— 离散对数问题;
ECC —— 离散对数问题。
5. 数字签名算法(认证)
5.1 概述
在 第 2 节,我们讨论了验证数据完整性的消息摘要算法。在数据完整性的基础上,我们往往需要认证消息的来源,并具备抗否认的作用,能够实现这一功能的算法称为 数字签名算法(Signature Algorithm)。
提示: 数字签名也称为数字指纹(Digital Fingerprint)。
数据签名算法分为两个主要步骤为签名 & 验证,具体如下:
-
1、签名(sign): 发送方生成数字签名,并且在发送数据时需要将原始消息和签名作为整体发送(如何签名见下文);
-
2、验证(vertify): 接收方收到消息和签名后,验证两者是否匹配(如何验证见下文)。
需要注意的是,如果任何机构都可以进行签名处理,就无法确保消息的来源,因此签名时就必须引入发送方的私有信息,而验证时使用公共信息,这正好与非对称加密不谋而合。所以,数字签名算法往往结合了消息摘要算法和非对称加密算法。
- 消息摘要算法: 用于对数据本身做摘要处理,确保数据完整性;
- 非对称加密算法: 用于对消息摘要做签名 / 验证,确保数据的抗否认性。
5.2 数字签名 & 验证模型
现在具体说下签名 & 验证两个操作:
- 1、私钥签名: 先使用消息摘要算法对原始消息做摘要处理,然后再使用私钥对摘要进行签名;
- 2、公钥验证: 使用公钥验证签名,检查是否与消息的摘要值。
提示: 为什么不是先使用私钥对原数据签名,再对签名进行摘要呢?
因为消息摘要具有单向性,无法从摘要反向获得签名,其次,如果原数据越长,对其进行签名需要的时间越长,所以上述方法不可行。
提示: 如果需要对原始消息加密,应该先做签名,再做消息加密。即:加密与签名都应该只针对原始消息(明文)做处理。 加密是为了确保消息在传送过程中避免被破解,签名是为了确保消息的有效性。消息本身可能就是一个可执行的文件,而这个文件本身是不需要加密的。
5.3 算法实现
举例:RSA、DSA、ECDSA
RSA算法则既是最为常用的非对称加密算法,又是最为常用的签名算法。DSA算法是典型的数字签名算法,虽然其本身属于非对称加密算法不具备数据加密与解密的功能。Editting...
6. 数字证书
在 第 4 节,我们讨论了非对称加密算法,它解决了密钥分配的问题。在私钥保密性的基础上,我们还需要保证公钥的来源合法,这就需要借助数字证书,数字证书本质上就是提供了一个认证的公钥。
签名文件和证书文件是成对出现的,二者不可分离,而且后面通过源码可以看到,这两个文件的名字也是一样的,只是后缀名不一样。数字签名要确保可靠通信,必须要解决两个问题:首先,要确定消息的来源确实是其申明的那个人;其次,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以发觉出来。所谓数字签名,就是为了解决这两个问题而产生的,它是对前面提到的非对称加密技术与数字摘要技术的一个具体的应用。对于消息的发送者来说,先要生成一对公私钥对,将公钥给消息的接收者。
6.1 数字证书签发 & 验证模型
Editting...
6.2 数字证书的数据结构
Editting...
7. 总结
- 非对称加密算法用于对数据进行加密/解密操作,确保数据的机密性;
- 消息摘要算法用于对数字证书本身做摘要处理,确保数字证书完整性。
- 数字签名算法用于对数据进行签名/验证操作,确保数据的完整性和认证性;
参考资料
- 《Java加密与解密的艺术》(第 2、6、7、8、9、10 章) —— 梁栋 著
- 《数据结构与算法之美 · 哈希算法(上/下)》 —— 王争 讲,极客时间 出品
- 《趣谈网络协议 · HTTPS 协议》 —— 刘超 著,极客时间出品
- 《图解 HTTP》(第 7、8 章)—— 上野宜
- 《HTTP权威指南》(第 12、13 章) —— [美] David Gourley,Brian Totty等 著
推荐阅读
- 密码学 | Base64是加密算法吗?
- 算法面试题 | 回溯算法解题框架
- 算法面试题 | 链表问题总结
- 计算机网络 | 图解 DNS & HTTPDNS 原理
- Android | 带你探究 LayoutInflater 布局解析原理
- Android | 适可而止!看 Glide 如何把生命周期安排得明明白白
- Android | View & Fragment & Window 的 getContext() 一定返回 Activity 吗?
网友评论