公开文集
0x01 SRC 资产管理系统
0x02 Web 漏洞案例库
0x03 小程序漏洞案例库
第一章:小程序渗透基础
1.1 微信小程序反编译与动态调试
1.2 微信小程序强制开启开发者模式
0x99 信息安全学习体系
01-网络安全基础
Day-001-TCP-IP协议栈安全分析
Day-002-DNS协议安全与DNS劫持攻防
Day-003-IPv6 安全基础与过渡
Day-004-HTTP-HTTPS协议深度解析
Day-005-网络嗅探与流量分析技术
Day-006-防火墙原理与配置实践
Day-007-网络地址转换 NAT 安全分析
Day-008-路由协议安全 RIP-OSPF-BGP
Day-009-VLAN 安全与 VLAN-Hopping
Day-010-无线网络基础与安全 802.11
Day-011-网络访问控制 802.1X-NAC
Day-012-网络分段与微隔离设计
Day-013-负载均衡器安全配置
Day-014-CDN安全与防护
Day-015-NTP安全
Day-016-DHCP安全与攻击防护
Day-017-ICMP协议安全分析
Day-018-网络协议模糊测试基础
Day-019-网络流量基线建立
Day-020-网络取证基础
Day-021-网络入侵检测系统 NIDS
Day-022-网络入侵防御系统 NIPS
Day-023-网络流量加密与解密
Day-024-网络协议逆向工程基础
Day-025-网络性能与安全权衡
Day-026-SDN 安全
Day-027-网络虚拟化安全
Day-028-网络欺骗技术
Day-029-网络威胁情报应用
Day-030-网络容量规划与安全
Day-031-网络安全架构设计实战
02-Web 安全
Day-032-OWASP-Top-10-2021详解
Day-033-SQL 注入原理与手工检测
Day-034-SQL注入进阶报错注入与盲注
Day-035-XSS跨站脚本攻击基础
Day-036-XSS 进阶绕过与利用
Day-037-XSS进阶绕过与利用
Day-038-CSRF 跨站请求伪造
Day-039-文件上传漏洞
Day-040-反序列化漏洞基础
Day-041-PHP反序列化深入
Day-042-Java反序列化深入
Day-043-SSTI 服务端模板注入
Day-044-文件包含漏洞 LFI-RFI
Day-045-命令注入漏洞
Day-046-XXE-XML 外部实体注入
Day-047-反序列化漏洞进阶
Day-048-API 安全基础
Day-049-API认证与授权安全
Day-050-API漏洞挖掘实战
Day-051-文件上传漏洞进阶
Day-052-反序列化漏洞实战
Day-053-Web 安全综合实战
Day-054-移动安全基础
Day-055-Android 应用安全测试
Day-056-iOS 应用安全测试
Day-057-移动应用综合实战
Day-058-云安全基础
Day-059-AWS 安全实战
Day-060-Azure 安全实战
Day-061-GCP 安全实战
Day-062-云安全综合实战
Day-063-容器安全基础
Day-064-Docker 安全实战
Day-065-Kubernetes 安全实战
Day-066-容器安全综合实战
Day-067-API 安全进阶
Day-068-服务端请求伪造 SSRF 深入
Day-069-文件上传漏洞进阶
Day-070-反序列化漏洞实战进阶
Day-071-业务逻辑漏洞深入
Day-072-前端安全深入
Day-073-Web 安全综合实战
Day-074-云安全进阶
Day-075-移动安全进阶
Day-076-API 安全进阶
Day-077-前端安全进阶
Day-078-业务逻辑漏洞进阶
Day-079-反序列化漏洞实战进阶
Day-080-文件上传漏洞实战进阶
Day-081-SSTI 服务端模板注入进阶
Day-082-XXE-XML 外部实体注入进阶
Day-083-SSRF 服务端请求伪造进阶
Day-084-命令注入漏洞进阶
Day-085-文件包含漏洞进阶
Day-086-反序列化漏洞实战进阶
Day-087-文件上传漏洞实战进阶
Day-088-SSTI 服务端模板注入实战进阶
Day-089-XXE-XML 外部实体注入实战进阶
Day-090-SSRF 服务端请求伪造实战进阶
Day-091-命令注入漏洞实战进阶
Day-092-Web 安全综合实战
Day-093-GraphQL 安全
Day-094-JWT 与 OAuth2 安全
03-系统安全
Day-095-系统监控与检测
Day-096-主机防火墙配置
Day-097-系统审计与合规
Day-098-Linux 系统安全进阶
Day-099-Windows 系统安全进阶
Day-100-容器安全进阶
Day-101-容器编排安全进阶
Day-102-Linux 内核安全
Day-103-Windows 内核安全
Day-104-系统安全总结与实战
Day-105-Linux 系统安全基础
Day-106-Windows 系统安全基础
Day-107-容器安全基础
Day-108-系统加固技术
Day-109-日志分析技术
Day-110-威胁狩猎技术
04-应用安全
Day-111-安全编码规范
Day-112-输入验证技术
Day-113-输出编码技术
Day-114-错误处理安全
Day-115-会话管理安全
Day-116-认证安全
Day-117-授权安全
Day-118-数据保护安全
Day-119-日志安全
Day-120-API 安全
Day-121-微服务安全
Day-122-新兴技术安全概论
Day-123-DevSecOps 流水线安全
Day-124-云原生安全架构
Day-125-API 安全最佳实践
Day-126-安全编码规范
Day-127-SDL 安全开发生命周期
Day-128-威胁建模实战
Day-129-安全需求分析
Day-130-安全架构设计
Day-131-安全编码实践Java
Day-132-安全编码实践Python
Day-133-代码审计方法论
Day-134-静态代码分析SAST
Day-135-动态应用测试DAST
Day-136-交互式测试IAST
Day-137-软件成分分析SCA
Day-138-依赖漏洞管理
Day-139-安全测试自动化
Day-140-漏洞管理与响应
Day-141-应用安全总结与展望
Day-142-OWASP-Top10-2024 详解
Day-143-CWE-Top25 分析
Day-144-漏洞挖掘方法论
Day-145-模糊测试技术
Day-146-逆向工程基础
Day-147-漏洞利用开发基础
Day-148-漏洞复现与验证
Day-149-漏洞披露流程
Day-150-CVE 申请与管理
Day-151-漏洞赏金计划
Day-152-等保2.0详解
Day-153-GDPR 合规实践
Day-154-数据安全法解读
Day-155-个人信息保护法与合规指南
Day-156-个人信息保护法解读
Day-157-ISO-27001 信息安全管理体系
Day-158-SOC-2 合规与审计
Day-159-PCI-DSS 支付卡行业数据安全标准
Day-160-网络安全审查办法解读
Day-161-数据出境安全评估办法
Day-162-应用安全评估实战
Day-163-红蓝对抗演练
Day-164-安全应急响应
Day-165-安全运营中心建设
Day-166-应用安全总结与展望
05-密码学
Day-167-密码学基础
Day-168-对称加密算法详解
Day-169-非对称加密算法详解
Day-170-哈希函数与数字签名
Day-171-密钥管理与PKI
Day-172-TLS-SSL 协议详解
Day-173-国密算法详解
Day-174-认证与密钥协议
Day-175-随机数生成与熵源
Day-176-椭圆曲线密码学详解
Day-177-后量子密码学详解
Day-178-高级密码学主题
Day-179-密码学行业应用精选
Day-180-常用加密算法原理与实现
Day-181-密码学总结与展望
Day-182-密码学系列总结与展望
06-渗透测试
Day-183-渗透测试方法论
Day-184-信息收集技术详解
Day-185-漏洞扫描技术详解
Day-186-漏洞利用技术详解
Day-187-渗透测试中的漏洞利用框架
Day-188-漏洞利用框架与 Metasploit 深入
Day-189-渗透测试中的 WAF 绕过技术
Day-190-渗透测试中的模糊测试技术
Day-191-渗透测试中的代码审计与静态分析
Day-192-渗透测试中的密码哈希破解技术
Day-193-渗透测试报告编写指南
Day-194-Web 应用渗透测试
Day-195-渗透测试中的 API 安全测试
Day-196-渗透测试中的 GraphQL 安全测试
Day-197-渗透测试中的前后端分离应用测试
Day-198-渗透测试中的小程序安全测试
Day-199-渗透测试中的浏览器安全测试
Day-200-OAuth-SSO安全测试
Day-201-渗透测试中的业务逻辑漏洞测试
Day-202-渗透测试中的厚客户端安全测试
Day-203-渗透测试综合实战演练
Day-204-内网渗透技术详解
Day-205-渗透测试中的内网信息收集进阶
Day-206-渗透测试中的域森林渗透技术
Day-207-渗透测试中的权限维持技术
Day-208-渗透测试中的横向移动技术
Day-209-渗透测试中的痕迹清理与反取证技术
Day-210-渗透测试中的数据窃取与 Exfiltration 技术
Day-211-渗透测试中的内部威胁与数据泄露测试
Day-212-渗透测试中的物理安全渗透
Day-213-社会工程学攻击技术
Day-214-移动应用渗透测试
Day-215-云安全渗透测试
Day-216-渗透测试中的容器与 Kubernetes 安全渗透
Day-217-渗透测试中的 Serverless 安全测试
Day-218-渗透测试中的微服务安全测试
Day-219-物联网安全渗透测试
Day-220-工业控制系统安全渗透测试
Day-221-无线网络安全渗透测试
Day-222-数据库安全渗透测试
Day-223-渗透测试中的供应链安全测试
Day-224-红队演练技术详解
Day-225-渗透测试中的红队基础设施搭建
Day-226-渗透测试中的威胁情报与狩猎
Day-227-渗透测试中的综合指纹识别技术
Day-228-自动化渗透测试技术
Day-229-渗透测试中的运维安全测试
Day-230-渗透测试中的区块链与智能合约安全测试
Day-231-渗透测试中的漏洞管理与修复验证
Day-232-渗透测试法律与合规
Day-233-后渗透攻击技术详解
Day-234-渗透测试中的人工智能应用
Day-235-漏洞利用开发深入
Day-236-云原生渗透测试深入
07-应急响应
Day-237-应急响应概述与核心概念
Day-238-应急响应流程框架
Day-239-CSIRT 团队组建与职责分工
Day-240-应急响应工具包准备
Day-241-应急响应法律与合规要求
Day-242-安全事件检测方法与指标
Day-243-云原生应急响应
Day-244-日志收集与分析技术
Day-245-网络流量分析与异常识别
Day-246-自动化响应与 SOAR
Day-247-端点监控与 EDR 技术
Day-248-威胁狩猎方法论
Day-249-威胁情报在检测中的应用
Day-250-数字取证基础与证据链管理
Day-251-内存取证技术
Day-252-磁盘取证与文件恢复
Day-253-网络取证与数据包分析
Day-254-云环境与容器取证
Day-255-恶意代码静态分析技术
Day-256-恶意代码动态分析技术
Day-257-恶意代码行为分析方法
Day-258-逆向工程基础与工具
Day-259-沙箱技术与自动化分析
Day-260-事件隔离与遏制策略
Day-261-威胁根除与系统修复
Day-262-系统恢复与数据重建
Day-263-业务连续性计划
Day-264-事件复盘与经验总结
Day-265-APT 攻击事件复盘分析
Day-266-勒索软件事件响应实战
Day-267-数据泄露事件处置流程
Day-268-内部威胁调查与取证
Day-269-综合应急响应演练
08-安全运维
Day-270-安全运营中心 SOC 概述
Day-271-安全监控指标体系
Day-272-安全告警管理
Day-273-安全可视化与仪表盘
Day-274-监控工具选型
Day-275-日志采集技术
Day-276-日志标准化与解析
Day-277-日志存储与归档
Day-278-日志分析技术
Day-279-日志合规要求
Day-280-SIEM 架构与设计
Day-281-关联规则引擎
Day-282-高级关联分析
Day-283-UEBA 用户实体行为分析
Day-284-威胁狩猎
Day-285-SOAR 基础概念
Day-286-剧本设计
Day-287-自动化响应技术
Day-288-安全工具集成
Day-289-SOAR 度量与优化
Day-290-安全基线管理
Day-291-漏洞管理流程
Day-292-补丁管理策略
Day-293-变更安全管理
Day-294-合规审计技术
Day-295-7x24 安全运营
Day-296-安全事件管理流程
Day-297-安全运营度量体系
Day-298-持续改进机制
Day-299-安全运维综合演练
Day-300-云原生安全运营
Day-301-AI 与机器学习安全运营
Day-302-安全自动化脚本实战
09-移动安全
Day-303-移动安全威胁概述
Day-304-移动设备安全架构
Day-305-移动操作系统安全模型
Day-306-移动应用权限管理
Day-307-移动端数据加密
Day-308-330-Android 安全合集
Day-309-Android 安全架构
Day-310-Android 组件安全
Day-311-Android 权限与隐私
Day-312-Android 逆向工程
Day-313-Android 应用加固
Day-314-iOS 安全架构
Day-315-iOS 应用沙盒机制
Day-316-越狱与反越狱
Day-317-iOS 逆向工程
Day-318-iOS 企业分发安全
Day-319-移动安全开发生命周期
Day-320-移动应用安全测试
Day-321-移动应用加固技术
Day-322-移动威胁防护
Day-323-移动安全合规
10-云安全
Day-324-云计算安全模型
Day-325-责任共担模型
Day-326-云安全威胁模型
Day-327-云安全合规框架
Day-328-云安全架构设计
Day-329-AWS IAM 安全
Day-330-AWS 网络安全
Day-331-AWS 存储安全
Day-332-AWS 安全监控
Day-333-AWS 安全最佳实践
Day-334-Azure AD 安全
Day-335-Azure 网络安全
Day-336-Azure 存储安全
Day-337-Azure 安全中心
Day-338-Azure 安全最佳实践
Day-339-容器安全基础
Day-340-Kubernetes 安全
Day-341-Serverless 安全
Day-342-云原生 DevSecOps
Day-343-云安全态势管理 CSPM
11-物联网工控
Day-344-物联网安全概述
Day-345-IoT 通信协议安全
Day-346-IoT 设备安全
Day-347-IoT 平台安全
Day-348-IoT 应用安全
Day-349-工业控制系统概述
Day-350-工控协议安全
Day-351-PLC 安全
Day-352-SCADA 系统安全
Day-353-工控安全防护
12-综合与总结
Day-354-安全职业发展路径
Day-355-安全技术趋势展望
Day-356-安全建设方法论
Day-357-经典攻防案例复盘
Day-358-安全学习资源指南
Day-359-信息安全行业求职指南
-
+
首页
Day-170-哈希函数与数字签名
# Day 184: 哈希函数与数字签名 > 密码学系列第 4 天 | 预计阅读时间:45 分钟 | 难度:★★★★☆ --- ## 清单 目录 1. [哈希函数概述](#哈希函数概述) 2. [SHA 家族详解](#sha 家族详解) 3. [哈希函数应用](#哈希函数应用) 4. [数字签名原理](#数字签名原理) 5. [RSA 签名](#rsa 签名) 6. [ECDSA 与 EdDSA](#ecdsa 与 eddsa) 7. [数字签名应用](#数字签名应用) 8. [安全实践](#安全实践) 9. [总结与思考](#总结与思考) 10. [参考资料](#参考资料) --- ## 哈希函数概述 ### 基本概念 **哈希函数定义**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 哈希函数基本概念 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 定义: │ │ 哈希函数 H 将任意长度的输入 m 映射到固定长度的输出 h │ │ h = H(m) │ │ │ │ 输出长度: │ │ ├── MD5: 128 位(16 字节) │ │ ├── SHA-1: 160 位(20 字节) │ │ ├── SHA-256: 256 位(32 字节) │ │ ├── SHA-384: 384 位(48 字节) │ │ ├── SHA-512: 512 位(64 字节) │ │ └── SHA-3: 可变长度(224/256/384/512 位) │ │ │ │ 核心特性: │ │ ├── 单向性(原像抵抗):给定 h,难以找到 m 使得 H(m)=h │ │ ├── 第二原像抵抗:给定 m1,难以找到 m2 使得 H(m1)=H(m2) │ │ ├── 碰撞抵抗:难以找到任意 m1, m2 使得 H(m1)=H(m2) │ │ ├── 确定性:相同输入总是产生相同输出 │ │ ├── 雪崩效应:输入微小变化导致输出巨大变化 │ │ └── 高效性:计算快速 │ │ │ │ 雪崩效应示例: │ │ SHA-256("hello") = 2cf24dba... │ │ SHA-256("hello!") = 7e2a6f... (完全不同) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 安全要求 **哈希函数安全级别**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 哈希函数安全要求 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 原像攻击(Preimage Attack) │ │ 攻击:给定哈希值 h,寻找任意 m 使得 H(m) = h │ │ 难度:2^n 次运算(n 为输出长度) │ │ 要求:计算上不可行 │ │ │ │ 第二原像攻击(Second Preimage Attack) │ │ 攻击:给定 m1,寻找 m2 ≠ m1 使得 H(m1) = H(m2) │ │ 难度:2^n 次运算 │ │ 要求:计算上不可行 │ │ │ │ 碰撞攻击(Collision Attack) │ │ 攻击:寻找任意 m1, m2 使得 H(m1) = H(m2) │ │ 难度:2^(n/2) 次运算(生日攻击) │ │ 要求:计算上不可行 │ │ │ │ 生日悖论: │ │ ├── 23 人中有 50% 概率生日相同 │ │ ├── 2^(n/2) 次哈希可找到碰撞 │ │ └── SHA-256: 2^128 次运算(安全) │ │ │ │ 安全强度对比: │ │ ┌────────────┬──────────────┬──────────────┐ │ │ │ 算法 │ 碰撞抵抗 │ 原像抵抗 │ │ │ ├────────────┼──────────────┼──────────────┤ │ │ │ MD5 │ 已攻破 │ 已攻破 │ │ │ │ SHA-1 │ 已攻破 │ 理论安全 │ │ │ │ SHA-256 │ 128 位 │ 256 位 │ │ │ │ SHA-384 │ 192 位 │ 384 位 │ │ │ │ SHA-512 │ 256 位 │ 512 位 │ │ │ └────────────┴──────────────┴──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## SHA 家族详解 ### SHA-1 **SHA-1 算法**: ``` ┌─────────────────────────────────────────────────────────────┐ │ SHA-1 算法 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 设计者:NSA(1995 年) │ │ ├── 标准:FIPS 180-4 │ │ ├── 输出长度:160 位(20 字节) │ │ ├── 分组长度:512 位 │ │ └── 轮数:80 轮 │ │ │ │ 状态: │ │ ✗ 碰撞攻击已攻破(2017 年 SHAttered 攻击) │ │ ✗ 不应再用于安全目的 │ │ △ 可用于非安全校验(如文件去重) │ │ │ │ 替代方案: │ │ ✓ SHA-256(推荐) │ │ ✓ SHA-3(备选) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### SHA-2 家族 **SHA-256 详解**: ``` ┌─────────────────────────────────────────────────────────────┐ │ SHA-256 算法 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 设计者:NSA(2001 年) │ │ ├── 标准:FIPS 180-4 │ │ ├── 输出长度:256 位(32 字节) │ │ ├── 分组长度:512 位 │ │ └── 轮数:64 轮 │ │ │ │ 算法结构(Merkle-Damgård): │ │ 1. 填充:消息填充到 512 位的倍数 │ │ - 添加 '1' 比特 │ │ - 填充 '0' 比特 │ │ - 添加 64 位长度 │ │ │ │ 2. 初始化:8 个初始哈希值(32 位) │ │ H0-H7 = SHA-256 初始常量(前 8 个素数的平方根小数部分)│ │ │ │ 3. 处理:每 512 位分组处理 │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 对于每个分组: │ │ │ │ 1. 消息调度:生成 64 个消息字 W0-W63 │ │ │ │ 2. 工作变量: a,b,c,d,e,f,g,h = H0-H7 │ │ │ │ 3. 64 轮压缩: │ │ │ │ 对于 t = 0 到 63: │ │ │ │ T1 = h + Σ1(e) + Ch(e,f,g) + Kt + Wt │ │ │ │ T2 = Σ0(a) + Maj(a,b,c) │ │ │ │ h = g, g = f, f = e, e = d + T1 │ │ │ │ d = c, c = b, b = a, a = T1 + T2 │ │ │ │ 4. 更新哈希值:Hi = Hi + 工作变量 │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ 4. 输出:连接 H0-H7 得到 256 位哈希值 │ │ │ │ 安全性: │ │ ✓ 无已知有效攻击 │ │ ✓ 碰撞抵抗:128 位安全 │ │ ✓ 原像抵抗:256 位安全 │ │ ✓ 广泛使用(比特币、TLS、密码存储) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` **SHA-512**: ``` ┌─────────────────────────────────────────────────────────────┐ │ SHA-512 算法 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 输出长度:512 位(64 字节) │ │ ├── 分组长度:1024 位 │ │ └── 轮数:80 轮 │ │ │ │ 与 SHA-256 对比: │ │ ├── 使用 64 位运算(SHA-256 用 32 位) │ │ ├── 64 位系统上更快 │ │ ├── 更高安全性(256 位碰撞抵抗) │ │ └── 输出更长(带宽占用大) │ │ │ │ 变体: │ │ ├── SHA-384:SHA-512 截断(输出 384 位) │ │ ├── SHA-512/224:SHA-512 截断(输出 224 位) │ │ └── SHA-512/256:SHA-512 截断(输出 256 位) │ │ │ │ 应用: │ │ ├── 高安全性需求 │ │ ├── 密码存储(配合 bcrypt/Argon2) │ │ └── 数字签名 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### SHA-3 **SHA-3(Keccak)**: ``` ┌─────────────────────────────────────────────────────────────┐ │ SHA-3 算法 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 设计者:Guido Bertoni 等(2007 年) │ │ ├── 标准:FIPS 202(2015 年) │ │ ├── 竞赛:NIST SHA-3 竞赛获胜者 │ │ ├── 结构:海绵结构(不同于 SHA-2 的 Merkle-Damgård) │ │ └── 优势:抗长度扩展攻击 │ │ │ │ 海绵结构(Sponge Construction): │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 吸收阶段(Absorbing): │ │ │ │ 输入 → XOR → 置换 → XOR → 置换 → ... │ │ │ │ │ │ │ │ 挤压阶段(Squeezing): │ │ │ │ 置换 → 输出 → 置换 → 输出 → ... │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 状态:1600 位(5x5x64 位三维数组) │ │ 轮数:24 轮 │ │ 轮函数:θρπχι(5 个步骤) │ │ │ │ 变体: │ │ ├── SHA3-224、SHA3-256、SHA3-384、SHA3-512 │ │ ├── SHAKE128、SHAKE256(可变长度输出) │ │ └── KangarooTwelve(快速模式) │ │ │ │ 优势: │ │ ✓ 与 SHA-2 不同设计(可互为备份) │ │ ✓ 抗长度扩展攻击 │ │ ✓ 硬件实现高效 │ │ ✓ 支持任意长度输出 │ │ │ │ 应用: │ │ ├── 新系统首选 │ │ ├── 与 SHA-2 混合使用 │ │ └── IoT 设备(硬件实现) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 国密 SM3 **SM3 哈希算法**: ``` ┌─────────────────────────────────────────────────────────────┐ │ SM3 算法(国密) │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 标准:GM/T 0004-2012 │ │ ├── 设计者:中国密码学会 │ │ ├── 输出长度:256 位(32 字节) │ │ ├── 分组长度:512 位 │ │ └── 轮数:64 轮 │ │ │ │ 结构: │ │ ├── Merkle-Damgård 结构(类似 SHA-256) │ │ ├── 8 个初始值 │ │ ├── 64 轮压缩函数 │ │ └── 非线性函数:FF、GG │ │ │ │ 安全性: │ │ ✓ 与 SHA-256 相当 │ │ ✓ 无已知有效攻击 │ │ ✓ 中国商用密码标准 │ │ │ │ 应用: │ │ ├── 数字签名(配合 SM2) │ │ ├── 消息认证 │ │ ├── 密码存储 │ │ └── 政务、金融系统 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 哈希函数应用 ### 密码存储 **安全密码存储实践**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 安全密码存储 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 错误做法: │ │ ✗ 明文存储 │ │ ✗ MD5(password) │ │ ✗ SHA-256(password) │ │ ✗ MD5(password + salt) │ │ │ │ 正确做法: │ │ ✓ 使用专用密码哈希函数 │ │ ✓ 每个密码使用唯一盐 │ │ ✓ 使用足够的迭代次数/工作量 │ │ ✓ 存储盐 + 哈希值 │ │ │ │ 推荐算法: │ │ ├── Argon2id(首选):2015 年密码哈希竞赛获胜者 │ │ │ - 抗 GPU 攻击 │ │ │ - 抗 ASIC 攻击 │ │ │ - 可调节内存、时间、并行度 │ │ │ │ │ ├── bcrypt:成熟可靠,广泛支持 │ │ │ - 自适应成本因子 │ │ │ - 内置盐 │ │ │ - 广泛部署 │ │ │ │ │ ├── scrypt:内存困难 │ │ │ - 抗 ASIC 攻击 │ │ │ - 内存密集型 │ │ │ - 加密货币使用 │ │ │ │ │ └── PBKDF2:标准支持好,但较弱 │ │ - NIST 推荐 │ │ - 广泛支持 │ │ - 但易受 GPU 攻击 │ │ │ │ 参数建议(2024 年): │ │ Argon2id: │ │ - 内存:64MB │ │ - 迭代:3 次 │ │ - 并行度:4 │ │ │ │ bcrypt: │ │ - 成本因子:12+(随硬件提升) │ │ │ │ PBKDF2-HMAC-SHA256: │ │ - 迭代:600000+(NIST 建议) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` **Python 密码存储示例**: ```python import argon2 import bcrypt # ============= Argon2 示例 ============= def argon2_password(): """使用 Argon2 哈希密码""" ph = argon2.PasswordHasher( time_cost=3, # 迭代次数 memory_cost=65536, # 64MB 内存 parallelism=4, # 并行度 hash_len=32, # 输出长度 salt_len=16 # 盐长度 ) # 哈希密码 password = "my_secret_password" hashed = ph.hash(password) print(f"Argon2 哈希:{hashed}") # 验证密码 try: ph.verify(hashed, password) print("✓ 密码正确") except argon2.exceptions.VerifyMismatchError: print("✗ 密码错误") # 检查是否需要重新哈希 if ph.check_needs_rehash(hashed): print("! 需要重新哈希(参数已过时)") # ============= bcrypt 示例 ============= def bcrypt_password(): """使用 bcrypt 哈希密码""" password = b"my_secret_password" # 生成盐并哈希 salt = bcrypt.gensalt(rounds=12) hashed = bcrypt.hashpw(password, salt) print(f"bcrypt 哈希:{hashed}") # 验证密码 if bcrypt.checkpw(password, hashed): print("✓ 密码正确") else: print("✗ 密码错误") if __name__ == "__main__": print("=== Argon2 密码哈希 ===") argon2_password() print("\n=== bcrypt 密码哈希 ===") bcrypt_password() ``` ### 数据完整性 **文件完整性校验**: ```python import hashlib from pathlib import Path def calculate_file_hash(filepath: str, algorithm: str = 'sha256') -> str: """计算文件哈希值""" hash_func = getattr(hashlib, algorithm)() with open(filepath, 'rb') as f: # 分块读取(适合大文件) for chunk in iter(lambda: f.read(8192), b''): hash_func.update(chunk) return hash_func.hexdigest() def verify_file_integrity(filepath: str, expected_hash: str) -> bool: """验证文件完整性""" actual_hash = calculate_file_hash(filepath) return actual_hash == expected_hash # 使用示例 if __name__ == "__main__": # 计算哈希 file_hash = calculate_file_hash('important_file.zip') print(f"SHA-256: {file_hash}") # 验证完整性 is_valid = verify_file_integrity('important_file.zip', file_hash) print(f"完整性验证:{'✓ 通过' if is_valid else '✗ 失败'}") ``` ### 区块链应用 **比特币中的哈希应用**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 哈希函数在区块链中的应用 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 交易哈希: │ │ TXID = SHA-256(SHA-256(transaction)) │ │ - 唯一标识交易 │ │ - 256 位(32 字节) │ │ │ │ 区块哈希: │ │ BlockHash = SHA-256(SHA-256(block_header)) │ │ - 链接区块(每个区块包含前一个区块哈希) │ │ - 工作量证明目标 │ │ │ │ 默克尔树: │ │ ├── 叶子节点:交易哈希 │ │ ├── 中间节点:子节点哈希的 SHA-256(SHA-256(left+right)) │ │ └── 默克尔根:包含在区块头中 │ │ │ │ 工作量证明: │ │ 要求:SHA-256(SHA-256(block_header)) < target │ │ 挖矿:暴力搜索 nonce 使区块哈希小于目标 │ │ 难度:自动调整(约 10 分钟一个区块) │ │ │ │ 地址生成: │ │ 1. 私钥 → ECDSA 公钥 │ │ 2. 公钥 → SHA-256 │ │ 3. SHA-256 输出 → RIPEMD-160 │ │ 4. 添加版本字节 + 校验和 → Base58Check 编码 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 数字签名原理 ### 基本概念 **数字签名定义**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 数字签名基本概念 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 定义: │ │ 数字签名是使用私钥对消息(或消息哈希)进行加密的结果 │ │ 用于验证消息的真实性和完整性 │ │ │ │ 签名流程: │ │ ┌─────────┐ ┌─────────┐ │ │ │ 发送方 │ │ 接收方 │ │ │ │ 私钥 │ │ 公钥 │ │ │ │ + │ ① 计算哈希 │ + │ │ │ │ 消息 │ H(m) │ 消息 │ │ │ │ │ ↓ │ │ │ │ │ │ ② 私钥签名 │ │ │ │ │ │ s = Sign(H(m))│ │ │ │ │ │───────────────▶│ │ │ │ │ │ 消息 + 签名 │ │ ③ 计算哈希 │ │ │ │ │ H(m') │ │ │ │ │ │ ↓ │ │ │ │ │ │ ④ 公钥验签 │ │ │ │ │ │ Verify(s) │ │ │ │ │ │ ↓ │ │ │ │ │ │ ✓/✗ 结果 │ │ │ └─────────┘ └─────────┘ │ │ │ │ 安全属性: │ │ ├── 认证性:确认发送方身份 │ │ ├── 完整性:确认消息未被篡改 │ │ └── 不可否认性:发送方不能否认已签名 │ │ │ │ 与加密的区别: │ │ ├── 加密:公钥加密,私钥解密(保密性) │ │ └── 签名:私钥签名,公钥验证(认证性) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 签名方案 **数字签名方案组成**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 数字签名方案组成 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 密钥生成(KeyGen) │ │ 输入:安全参数 │ │ 输出:(公钥 PK, 私钥 SK) │ │ │ │ 2. 签名(Sign) │ │ 输入:私钥 SK, 消息 m │ │ 输出:签名 σ │ │ σ = Sign(SK, m) │ │ │ │ 3. 验证(Verify) │ │ 输入:公钥 PK, 消息 m, 签名 σ │ │ 输出:有效/无效 │ │ valid = Verify(PK, m, σ) │ │ │ │ 正确性要求: │ │ Verify(PK, m, Sign(SK, m)) = ✓ (总是有效) │ │ │ │ 安全性要求(EUF-CMA): │ │ 存在性不可伪造(在适应性选择消息攻击下) │ │ 攻击者无法伪造有效签名(即使可以看到其他消息的签名) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## RSA 签名 ### PKCS#1 v1.5 签名 **RSA PKCS#1 v1.5 签名**: ``` ┌─────────────────────────────────────────────────────────────┐ │ RSA PKCS#1 v1.5 签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 签名流程: │ │ 1. 计算消息哈希:h = H(m) │ │ 2. 构建 DigestInfo:包含哈希算法 OID 和哈希值 │ │ 3. PKCS#1 填充:0x00 || 0x01 || PS || 0x00 || DigestInfo │ │ - PS:至少 8 字节的 0xFF │ │ 4. RSA 私钥操作:s = padded^d mod n │ │ 5. 输出签名:s │ │ │ │ 验签流程: │ │ 1. RSA 公钥操作:padded = s^e mod n │ │ 2. 验证填充格式:0x00 || 0x01 || ... │ │ 3. 提取 DigestInfo │ │ 4. 计算消息哈希:h' = H(m) │ │ 5. 比较:h == h' │ │ │ │ 安全性: │ │ △ 广泛使用 │ │ △ 存在理论攻击(实际影响有限) │ │ ✓ 配合 SHA-256 仍安全 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### RSA-PSS 签名 **RSA-PSS(Probabilistic Signature Scheme)**: ``` ┌─────────────────────────────────────────────────────────────┐ │ RSA-PSS 签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 设计目标: │ │ ├── 可证明安全(随机预言模型) │ │ ├── 概率签名(每次签名不同) │ │ └── 替代 PKCS#1 v1.5 │ │ │ │ 签名流程: │ │ 1. 计算消息哈希:h = H(m) │ │ 2. 生成随机盐:salt(通常与哈希输出等长) │ │ 3. MGF1 掩码生成:使用哈希函数生成掩码 │ │ 4. 构建 DB(数据块):包含盐和哈希 │ │ 5. 应用 MGF1 掩码 │ │ 6. RSA 私钥操作:s = encoded^d mod n │ │ 7. 输出签名:s │ │ │ │ 参数: │ │ ├── 哈希函数:SHA-256(推荐) │ │ ├── MGF1 哈希:SHA-256 │ │ └── 盐长度:32 字节(与 SHA-256 输出等长) │ │ │ │ 优势: │ │ ✓ 可证明安全 │ │ ✓ 概率签名(增强安全性) │ │ ✓ NIST 推荐 │ │ ✓ TLS 1.3 要求 │ │ │ │ 建议: │ │ ✓✓ 新系统首选 RSA-PSS │ │ ✗ 避免 PKCS#1 v1.5(除非兼容性要求) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 代码实现 **Python RSA 签名示例**: ```python from Crypto.PublicKey import RSA from Crypto.Signature import pss, pkcs1_15 from Crypto.Hash import SHA256 from Crypto.Random import get_random_bytes # ============= RSA-PSS 签名 ============= def rsa_pss_sign(): """RSA-PSS 签名/验签""" # 生成密钥对 key = RSA.generate(2048) private_key = key public_key = key.publickey() # 签名 message = b"Important document to sign" h = SHA256.new(message) signature = pss.new(private_key).sign(h) print(f"消息:{message}") print(f"签名:{signature.hex()[:64]}...") # 验签 try: pss.new(public_key).verify(h, signature) print("✓ PSS 验签成功") except (ValueError, TypeError): print("✗ PSS 验签失败") # 测试篡改检测 tampered = b"Tampered document" h_tampered = SHA256.new(tampered) try: pss.new(public_key).verify(h_tampered, signature) print("✗ 未检测到篡改") except (ValueError, TypeError): print("✓ 检测到篡改") # ============= RSA PKCS#1 v1.5 签名 ============= def rsa_pkcs1_sign(): """RSA PKCS#1 v1.5 签名/验签""" # 生成密钥对 key = RSA.generate(2048) private_key = key public_key = key.publickey() # 签名 message = b"Document with PKCS#1 v1.5 signature" h = SHA256.new(message) signature = pkcs1_15.new(private_key).sign(h) print(f"\n消息:{message}") print(f"签名:{signature.hex()[:64]}...") # 验签 try: pkcs1_15.new(public_key).verify(h, signature) print("✓ PKCS#1 v1.5 验签成功") except (ValueError, TypeError): print("✗ PKCS#1 v1.5 验签失败") if __name__ == "__main__": rsa_pss_sign() rsa_pkcs1_sign() ``` --- ## ECDSA 与 EdDSA ### ECDSA **ECDSA(椭圆曲线数字签名算法)**: ``` ┌─────────────────────────────────────────────────────────────┐ │ ECDSA 签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 基础:椭圆曲线离散对数问题 │ │ ├── 标准:FIPS 186-4 │ │ ├── 曲线:P-256、P-384、secp256k1 等 │ │ └── 应用:比特币、TLS、SSH │ │ │ │ 密钥生成: │ │ 1. 选择椭圆曲线参数(p, a, b, G, n, h) │ │ 2. 选择私钥 d(1 < d < n-1)随机数 │ │ 3. 计算公钥 Q = dG(点乘) │ │ 4. 公钥:Q │ │ 5. 私钥:d │ │ │ │ 签名流程: │ │ 1. 计算消息哈希:e = H(m) │ │ 2. 选择随机数 k(1 < k < n-1) │ │ 3. 计算点 (x1, y1) = kG │ │ 4. 计算 r = x1 mod n │ │ 5. 计算 s = k^(-1)(e + dr) mod n │ │ 6. 输出签名:(r, s) │ │ │ │ 验签流程: │ │ 1. 验证 r, s 在 [1, n-1] 范围内 │ │ 2. 计算 e = H(m) │ │ 3. 计算 w = s^(-1) mod n │ │ 4. 计算 u1 = ew mod n, u2 = rw mod n │ │ 5. 计算点 (x1, y1) = u1G + u2Q │ │ 6. 验证 r == x1 mod n │ │ │ │ 安全性注意事项: │ │ ! 随机数 k 必须唯一且保密 │ │ ! k 重复使用会泄露私钥(索尼 PS3 漏洞) │ │ ! k 必须有足够的随机性 │ │ │ │ 签名格式: │ │ ├── DER 编码:0x30 [总长] 0x02 [r 长] r 0x02 [s 长] s │ │ ├── P1363 编码:r || s(各固定长度) │ │ └── 比特币:DER 编码 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### EdDSA **EdDSA(Edwards 曲线数字签名算法)**: ``` ┌─────────────────────────────────────────────────────────────┐ │ EdDSA 签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 基本信息: │ │ ├── 设计者:Daniel J. Bernstein 等(2011 年) │ │ ├── 曲线:Ed25519(最常用)、Ed448 │ │ ├── 标准:RFC 8032 │ │ └── 特点:确定性签名(无需随机数) │ │ │ │ Ed25519 参数: │ │ ├── 曲线:Edwards25519 │ │ ├── 安全强度:~128 位 │ │ ├── 私钥长度:256 位(32 字节) │ │ ├── 公钥长度:256 位(32 字节) │ │ └── 签名长度:512 位(64 字节) │ │ │ │ 签名流程: │ │ 1. 哈希私钥:h = H(private_key) │ │ 2. 派生 s = h[0:32](前 32 字节) │ │ 3. 计算公钥 A = sG │ │ 4. 哈希消息:r = H(h[32:64] || message) │ │ 5. 计算 R = rG │ │ 6. 哈希:k = H(R || A || message) │ │ 7. 计算 S = (r + k*s) mod L │ │ 8. 输出签名:(R, S) │ │ │ │ 优势: │ │ ✓ 确定性签名(无需随机数,避免 k 重用问题) │ │ ✓ 抗侧信道攻击 │ │ ✓ 高性能(比 ECDSA 快) │ │ ✓ 实现简单 │ │ ✓ 签名短(64 字节) │ │ │ │ 应用: │ │ ├── SSH(Ed25519 密钥) │ │ ├── GPG/PGP │ │ ├── 加密货币(Monero、Cardano 等) │ │ └── TLS 1.3(可选) │ │ │ │ 建议: │ │ ✓✓ 新系统首选 Ed25519 │ │ ✓ 优于 ECDSA(除非兼容性要求) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 代码实现 **Python ECDSA/EdDSA 示例**: ```python from cryptography.hazmat.primitives.asymmetric import ec, ed25519 from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.backends import default_backend # ============= ECDSA 签名 ============= def ecdsa_demo(): """ECDSA 签名/验签演示""" # 生成密钥对(P-256) private_key = ec.generate_private_key(ec.SECP256R1(), default_backend()) public_key = private_key.public_key() # 签名 message = b"Message signed with ECDSA" signature = private_key.sign(message, ec.ECDSA(hashes.SHA256())) print("=== ECDSA 签名 ===") print(f"消息:{message}") print(f"签名:{signature.hex()}") # 验签 try: public_key.verify(signature, message, ec.ECDSA(hashes.SHA256())) print("✓ ECDSA 验签成功") except Exception as e: print(f"✗ ECDSA 验签失败:{e}") # 测试篡改 tampered = b"Tampered message" try: public_key.verify(signature, tampered, ec.ECDSA(hashes.SHA256())) print("✗ 未检测到篡改") except Exception: print("✓ 检测到篡改") # ============= Ed25519 签名 ============= def ed25519_demo(): """Ed25519 签名/验签演示""" # 生成密钥对 private_key = ed25519.Ed25519PrivateKey.generate() public_key = private_key.public_key() # 签名 message = b"Message signed with Ed25519" signature = private_key.sign(message) print("\n=== Ed25519 签名 ===") print(f"消息:{message}") print(f"签名:{signature.hex()}") print(f"签名长度:{len(signature)} 字节") # 验签 try: public_key.verify(signature, message) print("✓ Ed25519 验签成功") except Exception as e: print(f"✗ Ed25519 验签失败:{e}") # 测试篡改 tampered = b"Tampered message" try: public_key.verify(signature, tampered) print("✗ 未检测到篡改") except Exception: print("✓ 检测到篡改") # ============= 密钥导出 ============= def key_export_demo(): """密钥导出演示""" # Ed25519 private_key = ed25519.Ed25519PrivateKey.generate() # 导出私钥(PEM) pem_private = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) # 导出公钥(PEM) pem_public = private_key.public_key().public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) print("\n=== 密钥导出 ===") print(f"私钥 PEM:\n{pem_private.decode()[:100]}...") print(f"公钥 PEM:\n{pem_public.decode()[:100]}...") if __name__ == "__main__": ecdsa_demo() ed25519_demo() key_export_demo() ``` --- ## 数字签名应用 ### 代码签名 **代码签名应用**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 代码签名应用 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 目的: │ │ ├── 验证软件发布者身份 │ │ ├── 确保代码未被篡改 │ │ └── 建立用户信任 │ │ │ │ 平台实现: │ │ ├── Windows Authenticode │ │ │ - 签名工具:signtool.exe │ │ │ - 证书:代码签名证书(CA 颁发) │ │ │ - 验证:Windows 自动验证 │ │ │ │ │ ├── Apple Notarization │ │ │ - 要求:macOS 应用必须公证 │ │ │ - 流程:签名 → 上传 Apple → 公证 → 下载 │ │ │ - 工具:codesign, notarytool │ │ │ │ │ ├── Linux (GPG) │ │ │ - 发行版签名:Debian、Ubuntu 等 │ │ │ - 工具:gpg --sign │ │ │ - 验证:apt 自动验证 │ │ │ │ │ └── Java (JAR 签名) │ │ - 工具:jarsigner │ │ - 验证:Java 自动验证 │ │ │ │ 最佳实践: │ │ ✓ 使用 EV 代码签名证书(增强信任) │ │ ✓ 时间戳签名(证书过期后仍有效) │ │ ✓ 保护私钥(HSM 存储) │ │ ✓ 定期轮换密钥 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 证书签名 **X.509 证书签名**: ``` ┌─────────────────────────────────────────────────────────────┐ │ X.509 证书签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 证书结构: │ │ ├── 版本号 │ │ ├── 序列号 │ │ ├── 签名算法 │ │ ├── 颁发者(Issuer) │ │ ├── 有效期(Validity) │ │ ├── 主体(Subject) │ │ ├── 主体公钥信息 │ │ ├── 扩展(Extensions) │ │ └── 颁发者签名 │ │ │ │ 证书链: │ │ 根 CA → 中间 CA → 终端实体证书 │ │ │ │ 签名过程: │ │ 1. CA 生成证书内容(TBSCertificate) │ │ 2. CA 计算哈希:H(TBSCertificate) │ │ 3. CA 私钥签名:Sign(CA_private, hash) │ │ 4. 签名附加到证书 │ │ │ │ 验证过程: │ │ 1. 使用 CA 公钥验证签名 │ │ 2. 验证证书链(到信任根) │ │ 3. 检查有效期 │ │ 4. 检查吊销状态(CRL/OCSP) │ │ │ │ 签名算法: │ │ ├── sha256WithRSAEncryption(RSA-SHA256) │ │ ├── ecdsa-with-SHA256(ECDSA-SHA256) │ │ └── ed25519(新兴支持) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 文档签名 **PDF/Office 文档签名**: ``` ┌─────────────────────────────────────────────────────────────┐ │ 文档数字签名 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ PDF 签名: │ │ ├── 标准:PAdES(PDF Advanced Electronic Signatures) │ │ ├── 工具:Adobe Acrobat、iText、PyPDF2 │ │ ├── 签名类型: │ │ │ - 可见签名(带签名域) │ │ │ - 不可见签名 │ │ │ - 时间戳签名 │ │ └── 验证:Adobe Reader 自动验证 │ │ │ │ Office 文档签名: │ │ ├── 格式:XMLDsig(XML 数字签名) │ │ ├── 工具:Microsoft Office │ │ ├── 签名显示:签名行 │ │ └── 验证:Office 自动验证 │ │ │ │ 法律效力: │ │ ├── 电子签名法:多数国家承认 │ │ ├── 合格电子签名(QES):欧盟 eIDAS │ │ └── 时间戳:确
myh0st
2026年4月13日 23:19
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码