Надежен ли хэш коммита 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".