【问题标题】:Can a git history be falsified?git历史可以伪造吗?
【发布时间】:2019-01-21 06:09:13
【问题描述】:

git 历史会被伪造吗?

我正在考虑以下信息:

  • 提交日期
  • 提交内容
  • 提交者的身份

如果是:

  • 有没有办法验证 git repo 的内容或使其可验证?
  • 如何知道 git 历史记录是否被修改?

【问题讨论】:

  • 这种方式可以破解Git,但也不是特别容易。 Git 的提交行为是为了防止这种情况发生而设置的。
  • 这样做会有什么好处?

标签: git trust authenticity


【解决方案1】:

您提到的所有字段都是用于识别提交的 SHA-1 的一部分。 因此,如果不创建新提交,就不可能更改这些字段。 新提交意味着,没有git 实现将接受重写的提交作为原始提交的替换,除非您强迫它。

通常,当您有一个git 提交 ID 时,它是迄今为止所有开发历史的加密哈希,以及包括的所有作者信息。可以检测到该数据的任何更改。

如果您想要额外的安全性,您可以使用 git commit -S 使用 PGP 密钥签署提交。

【讨论】:

  • PGP和GPG有什么区别?
  • @evolutionxbox GPG 基本上是 PGP 的 GNU 重新实现。加密是兼容的,但一个软件是 FOSS 而另一个是专有的。 GPG 已经集成到很多 GNU/Linux 软件中,例如git,但它的数据格式仍然是 PGP 定义的格式。
【解决方案2】:

您可以相对轻松地修改提交的详细信息:How to add a changed file to an older (not last) commit in Git

但是,由于每个提交的 SHA-1 哈希包含父提交的哈希,这会更改所有后续提交的哈希。

有没有办法验证 git repo 的内容或使其可验证?

您可以sign commits using GPG,但这仅用于标识作者。如果作者有恶意,这就引出了你的第二个问题:

如何知道 git 历史记录是否被修改?

这取决于您如何定义“修改”。据我所知,master 过去所指的内容没有历史记录,因此您无法轻易区分常规分支和“修改”历史记录。您也许可以检查 rev-log 是否有任何看起来很奇怪的东西。

【讨论】:

    【解决方案3】:

    如果您有权访问历史记录,则可以更改所有版本控制系统(clearcase、subversion、CVS、git)历史记录。 Git 正在分发,您拥有整个历史记录的副本(即 fork)。您只能更改您自己的分叉的历史记录(请参阅@mrks^1 答案)。

    当您想要分发回您的副本,将您的更改推送到另一个分支时,使用 --force 您可以覆盖目标历史记录:

    • 仅当您对目标远程分支具有写入权限时
    • 仅当远程分支未设置为只读时
    • 任何现有的分叉(您当前的分叉除外)都会注意到历史记录被覆盖,并会询问您要做什么(即合并)。

    这通常是组织中为避免其他用户覆盖历史而制定的。通常只有与主要生产历史路径相关的分支(例如分支=产品、生产、主等)。这将是定义工作流程的一部分。

    许多拥有 github 镜像的组织^2 都有此设置,例如,以确保 Github 本身(有意或无意)不会覆盖历史记录。

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多