Maven Artifact - 为什么使用 PGP 签名和 md5/sha1 哈希值?

问题描述 投票:0回答:1

为什么 Maven Central 需要两者 PGP 签名和 MD5/SHA-1/等。哈希值? PGP 签名还不够吗?

在 Maven 中央存储库上,每个工件都有一个:

  1. .asc
    文件 - 包含工件的 PGP 签名。
  2. .md5
    文件 - 包含工件的 MD5 摘要。
  3. .sha1
    文件 - 包含工件的 SHA-1 摘要。
  4. .sha256
    文件 - 包含工件的 SHA-256 摘要。
  5. .sha512
    文件 - 包含工件的 SHA-512 摘要。
  6. .asc.md5
    文件。
  7. .asc.sha1
    文件。
  8. .asc.sha256
    文件
  9. .asc.sha512
    文件。

例如,您可以查看此出版物:https://repo1.maven.org/maven2/org/gradle/gradlebuild/configuration-cache-report/1.0/
我不太确定

.asc.md5
.asc.sha1
等文件代表什么。这些摘要是用签名的私钥加密的吗?

我的推理如下:

  1. 我了解 MD5、SHA1、SHA256 和 SHA512 摘要的价值。它允许您检查您下载的工件是否未损坏。您可以通过自己计算(下载的工件)摘要并将其与相应的公共摘要进行比较来完成此操作。

  2. 我也很欣赏这并不能保证文物的真实性。因为“中间人”可能会为您提供恶意工件和相应的虚假

    .md5
    .sha1
    .sha256
    .sha512
    文件。我还了解到,使用
    https
    连接到 Maven Central 并不能解决这个问题。 (例如,可以通过机器上安装了自定义证书的代理访问该网站,有人可能在未经开发人员许可的情况下上传了恶意工件等)

  3. 我的理解是PGP签名通过以下机制解决了上述问题

    神器的创造者
    PGP(原始工件,私钥)=

    .asc
    文件
    据我了解,
    .asc
    文件是签名。这基本上是工件的摘要,然后使用私钥进行加密,并添加一些元信息,即哈希算法。

    Maven客户端 PGP(下载的工件,公钥,
    .asc

    文件)

      使用与计算签名摘要相同的哈希函数来计算下载的工件的摘要。我认为,这是作为元数据存储在签名本身上的(
    1. .asc
       文件)。
    2. 使用公钥解密签名中
    3. 包含的摘要。 比较步骤 1 和 2 的摘要。
    4. 因此,我想说,如果摘要
    匹配

    ,那么我们就验证了工件的真实性,但是我们也验证了它没有被损坏。不然摘要会不一样,对吗?

  4. 那么这就引出了一个问题。为什么我们需要额外的
.md5

.sha1
文件?
作为奖励问题。为什么公钥不需要也存储在 Maven 上?这不是让事情变得更清楚了吗?就目前情况而言,您没有验证真实性所需的所有文件/数据。您必须从 PGP 服务器获取公钥。

所以,总而言之,我有以下3个问题:

为什么 Maven Central 需要工件的 PGP 签名和 md5/sha1 哈希值?为什么 PGP 签名不够?
  1. .asc.md5
  2. .asc.sha1
    等文件代表什么?
    为什么公钥不与其他所有内容一起存储?
maven gradle pgp jar-signing maven-central
1个回答
3
投票
https://maven.apache.org/repository/guide-central-repository-upload.html

引用上面的指南(1):

为了提高中央存储库的质量,我们要求您为所有工件(所有文件
除了校验和

)提供 PGP 签名。

据我了解,任何工件(例如 JAR、ZIP、TAR 等)
都必须

进行签名。 md5 或 sha1 等校验和不需要签名。 (2) 它们是签名的校验和。特别是对于 Gradle,

Signing 插件

all 输出进行签名。例如,MavenPublication

通常输出 POM 和 JAR 工件。当指示签名插件对发布进行签名时,它会生成校验和文件
为每个工件签名。 请注意,您可以禁用某些校验和:

https://docs.gradle.org/6.0.1/release-notes.html#publication-of-sha256-and-sha512-checksums

(3) 将公钥发布到 Maven 存储库是不常见的。虽然我不相信有什么能阻止你。尽管由于它会被视为任何工件,所以您需要对其进行签名...这没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.