Day21-02|4.6.2 数字签名:证明来源、保护完整性并留下可信证据

本文对应《系统架构设计师教程(第2版)》第4章“信息安全技术基础知识”4.6.2“数字签名”。数字签名是公钥密码的重要应用,主要用于确认消息来源、验证内容完整性和支持不可否认性,广泛应用于电子合同、政务申报、支付授权、软件发布和配置变更。

一、学习目标

完成本节后,应能够:

  1. 解释数字签名的生成、传输和验证过程;
  2. 区分数字签名、数据加密、哈希和消息认证码;
  3. 理解签名私钥、公钥证书、时间戳和验证证据的关系;
  4. 分析签名覆盖范围、证书吊销、重放和长期验证风险;
  5. 在案例和论文中设计可审计、可追溯、可长期验证的签名体系。

二、什么是数字签名

数字签名是签名者使用自己的私钥,对消息或消息摘要生成的一段可验证数据。验证者使用签名者的公钥检查签名是否有效,并确认消息在签署后没有被修改。

数字签名主要提供三个安全作用:真实性,证明签名与某个公钥对应的主体有关;完整性,证明被签名内容在签署后未被篡改;不可否认性,在私钥由签名者可靠控制、身份认证和证据保存完整的条件下,签名者较难否认曾经进行签署。

安全机制 主要解决的问题 是否适合证明签名主体
加密 未授权者能否读取内容 不一定
哈希 内容摘要是否变化 不能单独证明主体
MAC 共享密钥双方能否发现篡改 难以向第三方证明具体主体
数字签名 来源、完整性和签署证据 可以结合证书和审计支持

数字签名不是“给文件盖一个图片印章”,也不是简单把整段明文用私钥加密。现代签名通常先对规范化内容计算摘要,再使用私钥对摘要或签名结构处理,以降低计算量并避免内容歧义。

三、数字签名的基本流程

签名流程可以分为签名生成和签名验证两部分。

签名生成

签名者先确定待签名内容和版本,进行规范化处理,计算消息摘要,再使用自己的签名私钥生成签名,并将签名、证书、算法标识和必要元数据附加到消息或签名容器中。

签名验证

验证者取得消息和签名,首先确认签名者证书和公钥可信,再按相同规范化规则计算消息摘要,使用证书公钥验证签名,最后检查证书用途、有效期、吊销状态、时间戳和签名覆盖范围。

规范化内容 → 摘要 → 私钥签名 → 签名数据

消息与签名 → 证书公钥验签 → 重新计算摘要 → 一致则通过

签名验证成功只说明数学关系和内容一致,还需要结合证书和业务上下文判断签名主体、签署时间、权限和合同状态是否有效。

四、消息摘要的作用

哈希算法把任意长度消息映射为固定长度摘要。安全哈希应具有单向性、抗碰撞性和对输入微小变化敏感等特征。数字签名对摘要进行处理,可以减少大文件签名开销,并让验证者快速发现内容是否改变。

摘要不能替代签名。攻击者可以修改消息后重新计算摘要,但没有签名者私钥就不能生成有效签名。摘要也不提供身份信息,必须与私钥、证书和验证链结合使用。

签名前要确定规范化规则。JSON字段顺序、空格、编码、时间格式、附件顺序和字符集不同,都可能导致相同业务内容产生不同摘要。若签名只覆盖部分字段,未覆盖的金额、收件人、有效期或附件可能被替换,造成业务风险。

五、签名私钥与验证公钥

签名私钥必须由签名主体独占控制。个人签名私钥、企业印章私钥、服务器软件签名私钥和CA私钥的风险等级不同,但都不能共享、复制到不受控设备或写入代码仓库。

验证公钥可以公开,但验证者必须确认它确实属于签名主体。数字证书把主体名称、公钥、用途、有效期和CA签名绑定起来。验证者需要检查证书链、主体信息、密钥用途、有效期和吊销状态。

企业签名系统要管理签名授权、印章使用、签署意愿、审批和人员变更。员工离职、法人变化、证书过期或私钥泄露时,要及时冻结或吊销证书。签名服务不能因为方便而让所有业务人员直接调用企业最高权限印章。

六、数字签名与数据加密的区别

数据加密的主要目标是机密性,通常使用接收方公钥加密、接收方私钥解密;数字签名的主要目标是来源和完整性,通常使用签名者私钥生成、签名者公钥验证。一个保密文件可以不签名,一个公开发布的软件包可以不加密但必须签名。

在电子合同场景中,合同可能同时需要保密和签名:先使用随机数据密钥对合同加密,再使用接收方公钥保护数据密钥,同时由签署方对规范化合同和关键元数据签名。加密和签名的对象、顺序、证书和审计都要明确。

七、数字签名与MAC的区别

MAC使用双方共享的秘密密钥生成认证码,接收方可以验证内容是否被篡改以及是否来自持有密钥的一方。但双方都拥有同一把密钥,接收方也可能生成相同的MAC,因此难以向第三方证明一定由发送方生成。

数字签名使用签名者私钥,验证者使用公开公钥验证,适合跨组织、公开发布和需要第三方审计的场景。它通常计算成本更高,证书和私钥管理更复杂。选择MAC还是数字签名,要看参与主体数量、信任关系、性能和不可否认性要求。

八、签名覆盖范围与规范化

签名最容易出现的工程问题是签名内容不完整。应明确签名覆盖正文、附件、金额、主体、版本、时间、业务编号、权限和必要扩展字段。签名后任何被保护字段改变,都应导致验签失败或重新签名。

附件要有明确顺序、名称、摘要和大小,避免替换同名文件。动态字段如当前时间、随机数和系统生成编号要说明是否纳入签名。若业务允许部分字段后续填写,应将其标记为未签名区域,并通过流程和权限保护。

规范化要统一编码、字段顺序、空值处理、数字格式、时间时区、换行和附件处理。不同平台、语言和版本要使用同一规范,否则签名方认为签署成功,验证方可能验签失败。规范化算法和版本也要纳入签名元数据。

九、证书、证书链与吊销

证书验证是数字签名可信的基础。验证者应确认签发机构可信,证书链能连接到信任根,证书主体与签名者匹配,签名用途允许当前业务,证书处于有效期内且没有被吊销。

私钥泄露、主体变更、证书误签发、设备报废和签名权限撤销都需要吊销证书。验证者可以通过CRL或OCSP查询状态,但在线服务不可用时要设计安全的缓存和降级策略。不能因为无法查询状态就默认信任高风险签名。

历史签名验证还要区分“当前证书过期”和“签署时是否有效”。如果有可信时间戳、签署时证书状态和完整证据,即使证书后来过期,也可能证明签署当时有效。长期归档要保存签名容器、证书链、时间戳、算法和验证结果。

十、时间戳与长期验证

时间戳服务由可信时间源对签名或摘要加盖时间证据,帮助证明某项数据在特定时间已经存在,并支持判断签署时证书和算法状态。系统时钟不应单独作为法律或审计证据,重要场景需要可信时间服务和防篡改记录。

长期验证要考虑算法老化、证书过期、CA变更、时间戳更新和文件格式可读性。电子合同、政务档案和软件发布材料应保存完整签名链,并在必要时采用追加签名、重新封装或算法迁移。迁移不能破坏原始签名和历史证据。

十一、数字签名应用场景

1. 电子合同

签名覆盖合同正文、附件、签署主体和版本,结合身份认证、签署意愿、时间戳和证书状态,保存签署证据和验签结果。

2. 政务申报

企业或个人对申报数据签名,政府系统验证主体和内容完整性,记录受理时间、证书、签名和处理结果。

3. 软件与镜像发布

发布者对安装包、容器镜像或固件签名,客户端验证签名主体、版本、来源和完整性,防止供应链中替换恶意文件。

4. 支付与配置授权

支付请求、配置变更和审批指令由授权主体签名,服务端验签并检查时间、金额、权限和防重放信息。

十二、签名服务架构

大型系统可以将签名能力集中到签名服务,业务应用提交待签名摘要、主体和业务上下文,签名服务负责权限检查、私钥调用、签名生成、证书封装和审计。私钥保存在硬件安全模块或受保护密码设备中,应用不能导出。

签名服务要支持同步签名和异步签名。低延迟交易可同步完成,高价值合同或批量文件可异步排队。任务要有唯一编号、状态、超时、重试和人工复核。重试不能造成重复签署或签署不同内容,系统要绑定摘要、版本和业务编号。

签名服务是关键基础设施,需要高可用、权限分离、密钥备份、故障恢复和审计。故障时不能让业务随意绕过签名直接执行,必要时采用受控人工流程或安全降级。

十三、案例分析:软件供应链签名平台

某企业发布桌面软件、容器镜像和嵌入式固件。过去发布包通过共享网盘传输,客户无法确认来源,开发人员共用一个签名私钥。

改进方案:建立软件制品库和可信签名服务,构建流水线生成制品摘要,发布审批通过后由专用签名账号调用硬件安全模块签名;签名覆盖制品内容、版本、平台、构建编号和发布元数据;客户使用可信根和发布者证书验签,检查证书用途、有效期、吊销状态和版本策略;开发、测试和生产使用不同签名身份;签名私钥不可导出,开发人员不能直接使用生产密钥;发布包、镜像和固件保存签名、证书链、时间戳和构建证明;版本升级防止回滚,客户端拒绝低于最低安全版本的制品;密钥泄露时吊销证书、停止受影响版本、重新签名和通知客户;签名请求、审批、验签失败和发布结果全程审计。

十四、综合知识练习

选择题1

数字签名的主要作用是( )。

A. 只压缩文件 B. 证明来源并保护完整性 C. 提高磁盘容量 D. 替代所有访问控制

答案:B。解析:数字签名主要提供真实性、完整性和在条件满足时的不可否认性。

选择题2

验证数字签名时,除了数学验签,还应检查( )。

A. 页面颜色 B. 证书主体、用途、有效期和吊销状态 C. 文件名是否好看 D. 打印机型号

答案:B。解析:数学验签成功不代表签名主体和证书在业务上可信。

选择题3

下列最有利于长期验证电子合同的是( )。

A. 只保存最终PDF B. 保存签名、证书链、时间戳、算法和验证证据 C. 删除旧证书 D. 不记录签署时间

答案:B。解析:完整签名证据和时间信息支撑历史验证与审计。

简答题

为什么数字签名不能简单理解为“用私钥加密文件”?

参考答案:数字签名通常先对规范化内容计算摘要,再使用签名者私钥生成签名结构,验证者用公钥验签并重新计算摘要。它的主要目标是证明来源、保护完整性和支持不可否认,而不是保护内容机密性。直接使用私钥处理整段文件既效率低,也无法解决证书归属、签名覆盖、时间戳和证据保存问题。

十五、论文素材与今日复盘

论文可写:“在电子签名体系设计中,我将签名内容、身份认证、证书信任、私钥保护和审计证据统一考虑。签名前对正文、附件、版本、主体和关键业务字段进行规范化和摘要处理,由签名服务调用硬件安全模块生成签名;验证时检查证书链、主体、用途、有效期、吊销状态和可信时间戳,并保存签名容器、证书、算法、时间、业务上下文和验签结果。对软件和配置发布实施签名验证、版本防回滚和生产密钥分权,对历史合同保留长期验证证据,确保来源可证、内容未改、过程可查。”

今日复盘:数字签名主要解决来源、完整性和不可否认;签名私钥必须由主体可靠控制,公钥必须通过证书建立信任;签名覆盖范围、规范化、证书吊销、时间戳和长期保存是工程难点。第4.6节完成,下一篇进入 4.7 信息安全的抗攻击技术。