git sha 使用它指向依赖版本是否安全?

Is git sha secure for using it to point a dependency version?

我想知道使用 git sha 指向依赖项的特定版本是否安全。 我知道这不是一个好习惯,但有时需要这样做。

我已经读到,通常情况下,无法选择提交 ID,因为它是使用很多东西自动计算的。 但是没有人提到你可以在本地重建git来覆盖这个算法,让我们生成重复的sha。

而且我没有读到 git 服务器会检查它以确保 git 客户端不会那样“损坏”。

那么,假设上述情况是可能的(请确认与否),shagit算不算安全?

你说的那种把戏叫做preimage attack。当前用于生成故意 SHA-1 冲突的技术要求 bogus-duplicate 的内容包含一个大的“二进制区域”——基本上是一个连续的字节块——攻击者可以在其中操纵这些字节。 PDF 图像在这里是很好的候选者,因为 PDF 可能包含此类块。

Git committag 对象不包含此类块。他们确实有一个区域,人们可以在其中 丢弃 一个像这样的块,但是这个区域向我们显示 日志消息 当您检查提交(使用 git loggit show)或标记(使用 git show)时标记消息 人类 很难错过这样一个事实,即在特定提交或标记被“祝福”为“可以使用”时,消息类似于:

Release version x.y

现在是:

Release version x.y
filler filler filler ... filler
<random bytes to produce desired hash>
<this section goes on and on for many pages>
footer footer footer ... footer

一个不费心查看提交消息或标记消息的自动化软件系统可能会被愚弄,但添加一个熵检测器就足够简单了,它会注意到这里的消息中的内容不再与类型匹配人类生成的数据(熵相对较低;参见 this blog entry on Shannon entropy and this IBM security document)。这是一个致命的赠品,计算 可以 自动化。

(消息大小也会从“小”跳到“比较大”,也可以单独使用。)

不过,如果您愿意,可以尝试使用 Git 的新 SHA-256 变体。 (但是您不能混合变体:您必须仅使用 SHA-1,或仅使用 SHA-256。至少,今天是这样。)