Biarkan saya mengeksplorasi mengapa ini adalah masalah yang menantang menggunakan internal git. Anda bisa mendapatkan sha1 dari commit saat ini dengan
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
Pada dasarnya Anda menjalankan checksum sha1 pada pesan yang dikembalikan oleh git cat-file commit HEAD
. Dua hal segera melompat keluar sebagai masalah ketika Anda memeriksa pesan ini. Satu adalah pohon sha1 dan yang kedua adalah waktu komit.
Sekarang waktu komit mudah dijaga dengan mengubah pesan dan menebak berapa lama waktu untuk membuat komit atau penjadwalan untuk komit pada waktu tertentu. Masalah sebenarnya adalah pohon sha1, yang bisa Anda dapatkangit ls-tree $(git write-tree) | git mktree
. Pada dasarnya Anda melakukan checksum sha1 pada pesan dari ls-tree, yang merupakan daftar semua file dan checksum sha1 mereka.
Oleh karena itu komit Anda sha1 checksum tergantung pada pohon Anda sha1 checksum, yang secara langsung tergantung pada file sha1 checksum, yang melengkapi lingkaran dan tergantung pada komit sha1. Dengan demikian Anda memiliki masalah melingkar dengan teknik yang tersedia untuk saya sendiri.
Dengan checksum yang kurang aman , telah terbukti memungkinkan untuk menulis checksum file ke dalam file itu sendiri melalui brute force; Namun, saya tidak tahu ada pekerjaan yang menyelesaikan tugas itu dengan sha1. Ini bukan tidak mungkin, tetapi hampir tidak mungkin dengan pemahaman kita saat ini (tetapi siapa tahu mungkin dalam beberapa tahun ini akan menjadi sepele). Namun, masih ini bahkan lebih sulit untuk memaksa karena Anda harus menulis (melakukan) checksum dari (pohon) checksum dari (gumpalan) checksum ke dalam file.