Надежен ли хэш коммита git?

При использовании кода из неизвестных третьих сторон на github, я всегда проверяю код на отсутствие явных бэкдоров, которые могли бы поставить под угрозу безопасность моей системы.

Определенное состояние репозитория, который я рассматриваю, вероятно, связано с тегом git и хэшем коммита. Как мы знаем, содержимое тега git может быть легко изменено. Поэтому повторная загрузка исходного кода и доверие к нему на основе тега версии определенно небезопасно.

Мой вопрос: при обновлении исходного кода могу ли я верить, что, если я извлекаю конкретный коммит на основе его полного хэша коммита, это на 100% тот же код, который я просматривал ранее?

Основное внимание в этом вопросе уделяется не вероятности возникновения коллизий sha1 вообще (поскольку коллизию намного проще вычислить, чем вычисление конкретного хэша sha1 - что, мы надеемся, в настоящий момент практически невозможна?), А каждому и каждый файл является частью этой суммы sha1, поэтому изменение всегда вызывает другой хэш.

2 ответа

Решение

Короче говоря: да.

На этой странице вы можете увидеть, как формируется эта сумма sha1. Он состоит из:

  • Исходное дерево коммита (которое раскрывается для всех поддеревьев и BLOB-объектов)
  • Родительский коммит sha1
  • Информация об авторе
  • Информация о коммиттере (верно, это разные!)
  • Сообщение коммита

Таким образом, каждое изменение в каждом файле содержится в расчете sha1sum. AFAIK Вы можете быть уверены, что любое изменение любого файла в любом случае даст различную сумму sha1.

РЕДАКТИРОВАТЬ: я начал работать через один из моих коммитов:

git cat-file commit HEAD

дает:

tree 563ccb5109fbf0a01d99517ca1dbe15db349592d
parent 3c6f0800708aeaaeaba804273406ddcd0b3175ad
...

сейчас git cat-file -p 563ccb5109fbf0a01d99517ca1dbe15db349592d:

100644 blob d8fe4fa70f618843e9ab2df67167b49565c71f25    .gitignore
100644 blob dba1ba3a31837debf7a28eceb194e86916b88cbc    README
040000 tree 37ad71e959c6dadd0e4b7aff8a0c6e85a0eff789    conf
040000 tree 60eca667ab8b5852ecd2dd2d91d198a3956a8b73    etc
040000 tree 634c4c2ec34aec14142b5991bd3a5126110f2cae    sbin
040000 tree 256db03954535d25d5f340603e707207170f199c    spec
040000 tree 9e1e156f88b842da471f52d4c135f391319b4991    usr

и я могу продолжить глубже git cat-file -p d8fe4fa70f618843e9ab2df67167b49565c71f25:

/.project

(это содержимое моего файла.gitignore) или git cat-file -p 256db03954535d25d5f340603e707207170f199c:

100644 blob 591367a913adbeb1c86d674d240fb08ab8ccf78b    base.spec

(который является содержанием моего каталога "spec").

так что, как вы можете видеть, содержимое каждого файла рекурсивно присутствует в сумме sha1 файла; затем в сумме sha1 исходного дерева и, наконец, в сумме sha1 коммита.

Git хэширует все, так что к вашему заголовку и вопросу итогов: да.


столкновение намного проще вычислить, чем вычисление определенного хэша sha1 - что, надеюсь, в настоящий момент практически невозможно?

Исправьте по обоим пунктам. Вы могли бы даже потерять "в значительной степени" часть, ответ на "возможно ли создать сообщение, имеющее заданный хэш-код SHA1", правильно "lol, no".

Другие вопросы по тегам