3. 制品签名原理:数字签名基础、哈希算法、非对称加密、签名与验签流程

在自动化流水线中集成 IDP 制品签名链路,核心是理解数字签名如何保证制品的完整性与来源真实性。数字签名并非对原始制品直接加密,而是通过哈希算法提取摘要,再使用非对称加密对摘要进行签名。本节将拆解这一技术栈的底层原理与标准流程。

3.1 数字签名基础

数字签名是一种电子签名,利用密码学技术实现以下三个目标:

  • 完整性:制品在传输或存储后未被篡改。
  • 认证性:确认签名者的身份(私钥持有者)。
  • 不可否认性:签名者无法否认自己签署过该制品。

数字签名不隐藏制品内容,而是附加一段签名数据,供接收方验证。在 IDP 场景中,签名通常由 CI/CD 流水线中的签名服务(如 Sigstore、JWT 签名器)完成,验签则由部署策略或策略引擎执行。

关键概念: 数字签名 ≠ 加密。签名使用私钥生成,公钥验证;加密使用公钥加密,私钥解密。两者密钥对用法相反。

3.2 哈希算法

哈希算法(Hash Algorithm)是数字签名的第一道工序。它将任意长度的制品文件映射为固定长度的摘要(Digest),具有以下特性:

  • 单向性:无法从摘要反推出原始制品。
  • 抗碰撞性:极难找到两个不同制品产生相同摘要。
  • 雪崩效应:制品微小改动会导致摘要完全变化。

在制品签名链路中,常用的哈希算法如下:

算法 摘要长度 安全性 IDP 推荐场景
SHA-256 256 bit 高(当前标准) 通用制品签名、容器镜像摘要
SHA-384 384 bit 更高 高安全等级签名(如 FIPS 合规)
SHA-512 512 bit 最高 长期存档签名、监管审计
MD5 / SHA-1 128 / 160 bit 已弃用(碰撞攻击) 禁止用于签名,仅用于校验
实践建议: 在自动化流水线中,优先使用 sha256sum 或 openssl dgst -sha256 计算制品摘要。IDP 签名链路通常要求摘要算法与签名算法配套声明。

3.3 非对称加密

非对称加密使用一对密钥:私钥(Private Key)和公钥(Public Key)。私钥由签名者秘密保管,公钥可公开分发。在数字签名中,非对称加密用于对哈希摘要进行签名操作,而非加密整个制品。

主流非对称加密算法对比:

算法 密钥长度 签名速度 验签速度 IDP 适用性
RSA 2048 / 4096 bit 较慢 较快 传统 PKI 体系,兼容性好
ECDSA 256 / 384 bit 快 快 现代 IDP(如 Sigstore、Cosign)首选
Ed25519 256 bit 极快 极快 高性能流水线,密钥短小
安全警告: 私钥必须存储在硬件安全模块(HSM)、密钥管理服务(KMS)或安全凭证存储中。禁止将私钥硬编码在流水线 YAML 或代码仓库中。

3.4 签名与验签流程

完整的制品签名与验签流程分为两个阶段,共六个步骤。以下 SVG 图展示了标准流程:

制品签名与验签流程 制品签名与验签流程 签名阶段(Signer) 原始制品(Artifact) 哈希计算(SHA-256) 摘要(Digest) 私钥签名(ECDSA) 签名数据 + 制品 验签阶段(Verifier) 接收制品 + 签名数据 哈希计算(SHA-256) 新摘要(Digest') 公钥验签(比对摘要) 通过 / 失败 传输 / 存储

3.5 签名与验签详细步骤

以下表格将流程拆解为可操作的步骤,对应流水线中的 API 调用点:

阶段 步骤 操作描述 流水线对应动作
签名 1. 计算摘要 对制品文件执行 SHA-256 哈希,得到固定长度摘要 sha256sum artifact.bin
2. 私钥签名 使用签名者私钥对摘要进行 ECDSA 签名运算 cosign sign-blob 或 openssl dgst -sign
3. 输出签名 生成签名数据(.sig 文件),与制品一同发布 上传至制品仓库(如 OCI Registry)
验签 4. 接收制品 从仓库拉取制品及其关联签名数据 docker pull 或 wget
5. 重新计算摘要 对接收到的制品执行相同哈希算法,得到新摘要 sha256sum artifact.bin
6. 公钥验签 使用签名者公钥解密签名,比对两个摘要是否一致 cosign verify-blob 或 openssl dgst -verify
核心逻辑: 验签时,如果新摘要与签名中解密出的摘要一致,则证明制品未被篡改且签名者身份可信。任何不一致都会导致验签失败,流水线应中断部署。

3.6 签名链路中的密钥管理

在 IDP 自动化流水线中,密钥管理是签名链路的安全基石。以下 SVG 图展示密钥对生成与分发的典型架构:

签名密钥对管理架构 签名密钥对管理架构 密钥生成中心 KMS / HSM / Vault 私钥存储 签名服务专用(不可导出) 公钥分发 公钥仓库 / TUF / OIDC 验签方 流水线 / 策略引擎 / 部署代理 公钥导出 私钥注入 公钥获取
IDP 集成提示: 在自动化流水线中,签名服务应通过 API 调用 KMS 获取签名操作,而非直接接触私钥文件。公钥可通过 OIDC 令牌或透明日志(如 Rekor)自动分发给验签方。

3.7 常见问题与避坑

  • 哈希算法不一致: 签名时使用 SHA-256,验签时误用 SHA-1,导致验签失败。必须在签名元数据中声明算法。
  • 私钥泄露: 私钥被意外提交到代码仓库或日志中。应使用密钥扫描工具(如 GitLeaks)在流水线中拦截。
  • 公钥信任锚缺失: 验签方未正确配置信任的公钥列表,导致攻击者使用自签名证书伪造制品。应使用 PKI 或 Sigstore 的信任根。
  • 签名数据与制品分离: 签名文件与制品未绑定存储,导致部署时无法找到对应签名。建议使用 OCI 镜像签名或 DSSE 封装格式。
安全红线: 永远不要跳过验签步骤。即使制品来自内部仓库,也必须执行验签,防止供应链攻击或内部篡改。