当前位置: 首页 > java >正文

数字签名与证书

1. 数字签名与证书

  1. 摘要算法用来实现完整性,能够为数据生成独一无二的“指纹”,常用的算法是 SHA-2;
  2. 数字签名是私钥对摘要的加密,可以由公钥解密后验证,实现身份认证和不可否认;
  3. 公钥的分发需要使用数字证书,必须由 CA 的信任链来验证,否则就是不可信的;
  4. 作为信任链的源头 CA 有时也会不可信,解决办法有 CRL(证书吊销列表)、OCSP((在线证书状态协议),还有终止信任。

在机密性的基础上还必须加上完整性、身份认证等特性,才能实现真正的安全。

1.1. 摘要算法

实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function)。

摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。

TLS推荐使用加密算法SHA-2。

SHA-2 实际上是一系列摘要算法的统称,总共有 6 种,常用的有 SHA224、SHA256、SHA384,分别能够生成 28 字节、32 字节、48 字节的摘要。

真正的完整性必须要建立在机密性之上,在混合加密系统里用会话密钥加密消息和摘要,叫哈希消息认证码(HMAC)。

1.2. 数字签名

私钥就是可以证明本人持有的东西,私钥 + 摘要算法实现数字签名, 同时实现,身份认证不可否认。

数字签名的原理其实很简单,就是把公钥私钥的用法反过来,之前是公钥加密、私钥解密,现在是私钥加密、公钥解密。

数字签名的过程:

  1. 创建消息摘要:发送者使用哈希函数(如SHA-256)生成消息的摘要,这是一个固定长度的字符串,代表了原始消息的内容。
  2. 使用私钥进行加密:发送者使用自己的私钥对消息摘要进行加密,生成数字签名。
  3. 发送消息和签名:发送者将原始消息和数字签名一起发送给接收者。
  4. 验证签名:接收者使用发送者的公钥对数字签名进行解密,得到消息摘要。
  5. 验证消息摘要:接收者生成接收到的消息的摘要。
  6. 比较摘要:接收者比较接收到的摘要和用发送者公钥解密得到的摘要。如果两者相同,说明消息未被篡改。

1.3. 数字证书和 CA

为了解决“公钥的信任”问题。

谁都可以发布公钥,我们还缺少防止黑客伪造公钥的手段,也就是说,怎么来判断这个公钥就是你或者某宝的公钥呢?

数字证书和CA的用途:

数字证书是由权威CA(证书颁发机构)签发的电子凭证,用于验证实体(如网站、个人)身份的真实性,并绑定其公钥信息。它通过加密和签名确保数据传输的机密性、完整性和不可抵赖性。

CA作为受信任的第三方,负责审核证书申请、签发证书,并建立信任链,防止身份伪造,是互联网信任体系的核心基础。两者共同保障通信安全与身份可信。

Question:那客户端如何解密服务器发的加密消息呢?

简要流程如下:

1. 客户端发起请求(Client Hello)

  • 浏览器发起 HTTPS 请求,告诉服务器自己支持哪些加密算法。
  • 这个阶段还没有加密。

2. 服务器回应(Server Hello)

  • 服务器选择加密算法。
  • 并把自己的 数字证书(包含公钥) 发给客户端。

3. 客户端验证证书是否合法

  • 用操作系统或浏览器内置的可信 CA 证书库验证服务器证书是否合法(比如看证书是不是被伪造的)。

4. 生成对称密钥(关键步骤)

  • 客户端用服务器的“公钥”加密一个随机生成的“对称密钥”(也叫会话密钥)。
  • 然后把这个加密后的密钥发送给服务器。

5. 服务器用私钥解密

  • 服务器用自己保管的“私钥”解密这个密钥,拿到会话密钥。

6. 后续通信都用这个对称密钥加密

  • 客户端和服务器都有了相同的“会话密钥”,后续通信(例如服务器返回的数据)就用这个密钥加密。
  • 客户端收到加密数据后,用同一个密钥解密即可。
http://www.xdnf.cn/news/5206.html

相关文章:

  • 北斗终端设备应用
  • 【含文档+源码】基于SpringBoot的新能源充电桩管理系统的设计与实现
  • ODA服务器计算节点本地硬盘状态异常的处理
  • 【金仓数据库征文】国产数据库KingbaseES安装与使用详解
  • 202535| Kafka架构与重要概念+幂等性+事务
  • [架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
  • kafka的安装及简单使用
  • 【并发编程】基于 Redis 手写分布式锁
  • 【源码+文档+调试讲解】高校创新创业课程124
  • Metasploit 4.22.7:企业级渗透测试新突破
  • 深入了解 ArkTS:HarmonyOS 开发的关键语言与应用实践
  • 装机容量与额定容量区别解析
  • 记录 ubuntu 安装中文语言出现 software database is broken
  • Kubernetes排错(十)-常见网络故障排查
  • OSPF综合性实验
  • 解决 SQL Server 2008 导入 Excel 表卡在“正在初始化数据流”问题
  • 基于DAMA框架的企业文件与内容管理深度解析
  • PyTorch API 5 - 全分片数据并行、流水线并行、概率分布
  • 泛型加持的策略模式:打造高扩展的通用策略工具类
  • 5.1 神经网络: 层和块
  • TWAS / FUSION
  • HTML属性
  • AI Coding的发展之路:从概念到改变世界的旅程
  • spring boot lunar 农历的三方库引用,获取日期的农历值
  • Linux 内核链表宏的详细解释
  • Scala与Go的异同教程
  • MySQL事务和JDBC中的事务操作
  • 深入解析:如何基于开源p-net快速开发Profinet从站服务
  • 2025年“深圳杯”数学建模挑战赛C题国奖大佬万字思路助攻
  • Java虚拟机的基本结构