数字签名与证书
1. 数字签名与证书
- 摘要算法用来实现完整性,能够为数据生成独一无二的“指纹”,常用的算法是 SHA-2;
- 数字签名是私钥对摘要的加密,可以由公钥解密后验证,实现身份认证和不可否认;
- 公钥的分发需要使用数字证书,必须由 CA 的信任链来验证,否则就是不可信的;
- 作为信任链的源头 CA 有时也会不可信,解决办法有 CRL(证书吊销列表)、OCSP((在线证书状态协议),还有终止信任。
在机密性的基础上还必须加上完整性、身份认证等特性,才能实现真正的安全。
1.1. 摘要算法
实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function)。
摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。
TLS推荐使用加密算法SHA-2。
SHA-2 实际上是一系列摘要算法的统称,总共有 6 种,常用的有 SHA224、SHA256、SHA384,分别能够生成 28 字节、32 字节、48 字节的摘要。
真正的完整性必须要建立在机密性之上,在混合加密系统里用会话密钥加密消息和摘要,叫哈希消息认证码(HMAC)。
1.2. 数字签名
私钥就是可以证明本人持有的东西,私钥 + 摘要算法实现数字签名, 同时实现,身份认证和不可否认。
数字签名的原理其实很简单,就是把公钥私钥的用法反过来,之前是公钥加密、私钥解密,现在是私钥加密、公钥解密。
数字签名的过程:
- 创建消息摘要:发送者使用哈希函数(如SHA-256)生成消息的摘要,这是一个固定长度的字符串,代表了原始消息的内容。
- 使用私钥进行加密:发送者使用自己的私钥对消息摘要进行加密,生成数字签名。
- 发送消息和签名:发送者将原始消息和数字签名一起发送给接收者。
- 验证签名:接收者使用发送者的公钥对数字签名进行解密,得到消息摘要。
- 验证消息摘要:接收者生成接收到的消息的摘要。
- 比较摘要:接收者比较接收到的摘要和用发送者公钥解密得到的摘要。如果两者相同,说明消息未被篡改。
1.3. 数字证书和 CA
为了解决“公钥的信任”问题。
谁都可以发布公钥,我们还缺少防止黑客伪造公钥的手段,也就是说,怎么来判断这个公钥就是你或者某宝的公钥呢?
数字证书和CA的用途:
数字证书是由权威CA(证书颁发机构)签发的电子凭证,用于验证实体(如网站、个人)身份的真实性,并绑定其公钥信息。它通过加密和签名确保数据传输的机密性、完整性和不可抵赖性。
CA作为受信任的第三方,负责审核证书申请、签发证书,并建立信任链,防止身份伪造,是互联网信任体系的核心基础。两者共同保障通信安全与身份可信。
Question:那客户端如何解密服务器发的加密消息呢?
简要流程如下:
1. 客户端发起请求(Client Hello)
- 浏览器发起 HTTPS 请求,告诉服务器自己支持哪些加密算法。
- 这个阶段还没有加密。
2. 服务器回应(Server Hello)
- 服务器选择加密算法。
- 并把自己的 数字证书(包含公钥) 发给客户端。
3. 客户端验证证书是否合法
- 用操作系统或浏览器内置的可信 CA 证书库验证服务器证书是否合法(比如看证书是不是被伪造的)。
4. 生成对称密钥(关键步骤)
- 客户端用服务器的“公钥”加密一个随机生成的“对称密钥”(也叫会话密钥)。
- 然后把这个加密后的密钥发送给服务器。
5. 服务器用私钥解密
- 服务器用自己保管的“私钥”解密这个密钥,拿到会话密钥。
6. 后续通信都用这个对称密钥加密
- 客户端和服务器都有了相同的“会话密钥”,后续通信(例如服务器返回的数据)就用这个密钥加密。
- 客户端收到加密数据后,用同一个密钥解密即可。