3. 制品签名基础概念:数字签名原理、哈希算法、非对称加密在制品签名中的应用

在 Backstage IDP 的制品签名链路中,数字签名是确保制品完整性、真实性和不可否认性的核心机制。理解其底层原理,是后续排查签名链路故障的基石。本节将拆解数字签名的三大支柱:哈希算法、非对称加密以及签名与验签流程。

3.1 核心概念速览

在深入细节前,先通过下表建立对三个核心组件的宏观认知:

组件 核心作用 在制品签名中的角色 典型算法/标准
哈希算法 将任意长度数据映射为固定长度摘要(指纹) 为制品内容生成唯一、不可逆的“数字指纹”,确保内容未被篡改 SHA-256, SHA-384
非对称加密 使用一对密钥(公钥 & 私钥)进行加解密 私钥用于签名(加密哈希值),公钥用于验签(解密哈希值) RSA, ECDSA, Ed25519
数字签名 结合哈希与非对称加密,提供完整性、认证、不可否认性 将制品的哈希值用签名者私钥加密,附加在制品上 PGP, Sigstore (Cosign), JWT

3.2 哈希算法:制品的“数字指纹”

哈希算法是签名链路的第一道防线。它接收整个制品文件(如 Docker 镜像、JAR 包)作为输入,通过数学函数计算出一个固定长度的十六进制字符串(摘要)。

  • 单向性:从摘要无法反向推导出原始制品内容。
  • 抗碰撞性:几乎不可能找到两个不同的制品拥有相同的哈希值。
  • 雪崩效应:制品内容哪怕只改动一个比特,生成的哈希值也会完全不同。
故障排查要点: 在 IDP 中,签名验证失败最常见的原因之一是哈希不匹配。例如,制品在构建后、签名前被重新压缩或添加了元数据,导致实际哈希值与签名时计算的哈希值不一致。排查时应首先确认签名时使用的哈希算法与验签时是否一致(如 SHA-256 vs SHA-1)。

3.3 非对称加密:密钥对的分工

非对称加密解决了对称加密中密钥分发的难题。在制品签名场景中,它定义了明确的角色分工:

  • 私钥(Private Key):由制品发布者(如 CI/CD 系统、开发者)严格保管,用于生成签名。私钥泄露意味着签名体系崩溃。
  • 公钥(Public Key):可以公开分发给任何需要验证制品的人或系统(如 Backstage 的软件目录、Kubernetes 集群),用于验证签名。

这种设计确保了:即使公钥被广泛传播,攻击者也无法伪造签名,因为他们没有私钥。

3.4 数字签名与验签流程(核心)

下图展示了在 Backstage IDP 中,一个制品从签名到验证的完整生命周期:

制品签名与验签流程 制品签名与验签流程 原始制品 哈希算法 (SHA-256) 制品摘要 (Hash) 签名者私钥 数字签名 已签名制品 已签名制品 哈希算法 (SHA-256) 计算摘要 (Hash') 发布者公钥 解密摘要 (Hash) Hash' == Hash ? 验证结果:若两个摘要一致,则签名有效,制品未被篡改且来源可信;否则验证失败。

3.5 签名与验签步骤详解

结合上图,我们将流程拆解为清晰的步骤:

3.5.1 签名阶段(发布者执行)

  1. 计算摘要:对原始制品文件运行哈希算法(如 sha256sum artifact.bin),得到固定长度的哈希值 H。
  2. 加密摘要:使用发布者的私钥对哈希值 H 进行加密,生成数字签名 S。
  3. 打包发布:将原始制品、数字签名 S 以及签名者身份信息(如证书或公钥指纹)打包在一起,发布到制品仓库。
Backstage 实践提示: 在 IDP 中,签名通常由 CI 流水线(如 GitHub Actions、Jenkins)在构建步骤后自动执行。Cosign 是 Sigstore 项目下的主流工具,支持对容器镜像和二进制文件进行签名,其默认使用 ECDSA-P256 算法。

3.5.2 验签阶段(消费者/Backstage 执行)

  1. 分离制品与签名:从制品仓库获取已签名制品,并提取出数字签名 S 和发布者公钥。
  2. 计算本地摘要:对获取到的制品文件运行与签名时相同的哈希算法,得到本地摘要 H'。
  3. 解密签名:使用发布者的公钥对数字签名 S 进行解密,得到原始摘要 H。
  4. 比对摘要:比较 H' 与 H。
    • 一致:签名验证通过。证明制品在传输过程中未被篡改,且确实由持有对应私钥的发布者签名。
    • 不一致:验证失败。触发告警,Backstage 应标记该制品为不可信。

3.6 常见算法对比与选择

在 IDP 环境中,选择合适的算法组合至关重要。下表对比了主流方案:

算法组合 哈希算法 非对称算法 签名长度 性能 安全性 典型工具
RSA-SHA256 SHA-256 RSA (2048/4096 bit) 256 / 512 字节 较慢(尤其签名) 高(广泛验证) GnuPG, OpenSSL
ECDSA-SHA256 SHA-256 ECDSA (P-256/P-384) 64 / 96 字节 快 高(同等安全强度下密钥更短) Cosign, TUF
Ed25519 SHA-512 (内部) EdDSA (Curve25519) 64 字节 非常快 极高(现代、抗侧信道) Sigstore, SSH
故障排查关键点: 算法不匹配是导致签名验证失败的常见原因。例如,签名方使用 RSA-2048,而验签方配置的公钥是 ECDSA-P256 格式;或者签名时使用 SHA-1(已废弃),而验签策略要求 SHA-256。在 Backstage 的签名插件配置中,务必显式声明并校验算法标识。

3.7 小结:签名链路中的信任锚点

数字签名并非孤立存在,它依赖于一个信任链。在 Backstage IDP 中,这个信任链通常表现为:

  • 根信任:谁的公钥是可信的?通常通过 PKI(公钥基础设施) 或 Sigstore 的无密钥签名(Keyless Signing) 解决。
  • 策略执行:Backstage 的软件目录或策略引擎(如 OPA)会定义:哪些公钥签名的制品可以被部署到生产环境。
  • 审计日志:每次签名和验签操作都应记录,以便在故障发生时进行追溯。