Es un hash de commit de git confiable?

Cuando uso código de terceros desconocidos en github, siempre me aseguro de verificar que no existan puertas traseras obvias que puedan comprometer la security de mi sistema.

El estado específico del repository que estoy revisando probablemente esté vinculado a una label de git y a un hash de confirmación. Como sabemos, el contenido de una label de git puede cambiarse fácilmente. Así que download el código fuente nuevamente y confiar en él basado en la label de la versión definitivamente no es seguro.

Mi pregunta es: ¿cuando puedo download una nueva versión del código fuente, puedo confiar en que si pago una confirmación específica basada en su hash de confirmación completo, que esto es 100% el mismo código que revisé antes?

El foco de esta pregunta no está en la probabilidad de que se produzcan colisiones sha1 (ya que una colisión es mucho más fácil de computar que calcular un hash sha1 específico, que es, con suerte, bastante imposible en este momento), pero si cada uno cada file es parte de esta sum sha1, por lo que un cambio siempre activará un hash diferente.

en resumen: sí.

en esta página puede ver cómo se forma esta sum sha1. Está compuesto de:

  • El tree fuente de la confirmación ( que se desennetworkinga a todos los subtreees y blobs )
  • El padre comete sha1
  • La información del autor
  • La información del committer (¡correcto, esos son diferentes!)
  • El post de confirmación

Entonces cada cambio en cada file está contenido en el cálculo del sha1sum. AFAIK puede confiar en que cualquier cambio en cualquier file daría en todos los casos una sum sha1 diferente.

EDITAR: Empecé a trabajar en uno de mis commits:

git cat-file commit HEAD 

da:

 tree 563ccb5109fbf0a01d99517ca1dbe15db349592d parent 3c6f0800708aeaaeaba804273406ddcd0b3175ad ... 

ahora 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 

y puedo continuar más profundo: git cat-file -p d8fe4fa70f618843e9ab2df67167b49565c71f25 :

 /.project 

(que es el contenido de mi file .gitignore) o git cat-file -p 256db03954535d25d5f340603e707207170f199c :

 100644 blob 591367a913adbeb1c86d674d240fb08ab8ccf78b base.spec 

(que es el contenido de mi directory "spec").

así como puede ver, el contenido de cada file está recursivamente presente en la sum sha1 del file ; luego en la sum sha1 del tree fuente , y finalmente en la sum sha1 de la confirmación .

Git hace un hash de todo, así que para su titular y la pregunta final: sí.


una colisión es mucho más fácil de computar que calcular un hash sha1 específico, que es, con suerte, bastante imposible en este momento.

Corrija en ambos aspectos. Incluso podría perder la parte "bonita", la respuesta a "¿es posible build un post con un código hash SHA1 dado" es "jaja, no"?