Riwayat yang bersih dari secret menyelesaikan kerahasiaan; keaslian adalah soal berikutnya. Kolom author pada commit hanyalah teks bebas — siapa pun yang punya akses push bisa menulis Budi Santoso <[email protected]> di situ, dan Git tidak memprotes. Tanda tangan digital pada commit menutup celah itu dengan dua bukti sekaligus: commit itu memang dibuat oleh pemegang sebuah kunci privat, dan isinya tidak berubah sedikit pun sejak ditandatangani. Chapter ini menjalankan siklus lengkapnya secara nyata — menandatangani, memeriksa, lalu diverifikasi dari sudut pandang orang lain.
Apa yang Dibuktikan Tanda Tangan #
Dua hal, dan hanya dua hal itu. Pertama, identitas: tanda tangan hanya bisa dibuat oleh pemegang kunci privat, sehingga klaim nama-email penulis berubah dari teks bebas menjadi klaim terkunci. Kedua, integritas: tanda tangan dibuat atas isi commit — tree, parent, pesan — sehingga satu byte pun yang diubah membuat verifikasi gagal. Yang dibuktikan bukan izin: tanda tangan tidak tahu apakah pemegang kunci berhak mendorong commit ke repository ini — itu wilayah Least Privilege dan pengaturan akses platform.
Kunci Latihan dalam Sekejap #
Tanda tangan commit memakai GPG (gpg 2.4.7 di sandbox), dan sandboxnya adalah direktori tersendiri lewat GNUPGHOME — kunci latihan tidak menyentuh keyring asli. Jalur tercepat membuat kunci adalah --quick-gen-key:
export GNUPGHOME=work/sandbox/keamanan-dan-akses/part-b/gpg-cepat
gpg --batch --pinentry-mode loopback --passphrase '' \
--quick-gen-key "Budi Santoso <[email protected]>" ed25519 sign nevergpg: keybox '/home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-cepat/pubring.kbx' created
gpg: /home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-cepat/trustdb.gpg: trustdb created
gpg: directory '/home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-cepat/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-cepat/openpgp-revocs.d/DF9709E5AC3B6E5920384B075C01CA99559F9B6A.rev'GPG lalu mencatat sertifikat pencabutan (revocation certificate) — berkat cadangan bila kunci sewaktu-waktu harus dimatikan. Satu baris itu cukup untuk kunci latihan; pembuatan kunci dengan kontrol penuh — algoritma, subkey, masa berlaku — dibedah di GPG Signing . Kita ambil ID kuncinya:
gpg --list-secret-keys --keyid-format longgpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-cepat/pubring.kbx
--------------------------------------------------------------------------------------------------
sec ed25519/5C01CA99559F9B6A 2026-10-13 [SC]
DF9709E5AC3B6E5920384B075C01CA99559F9B6A
uid [ultimate] Budi Santoso <[email protected]>ID pendeknya 5C01CA99559F9B6A — baris sec adalah kunci privat penandatangan, dan ID kunci selalu acak sehingga ID di mesin pembaca berbeda. Daftarkan kunci itu ke repository latihan:
cd work/sandbox/keamanan-dan-akses/part-b/latihan-signed
git config user.signingkey 5C01CA99559F9B6A
git config --get user.signingkey5C01CA99559F9B6AMenandatangani dan Membedah Tanda Tangannya #
Flag -S pada git commit meminta Git memanggil GPG untuk menandatangani objek commit — dokumentasi git-commit
menyebutnya sebagai tanda tangan atas seluruh isi commit:
git commit -S -m "Commit awal ditandatangani"Pemeriksaannya satu perintah:
git log --show-signature -1commit ae01253127fae5851c6174ea1c70e993c6e7fdb6
gpg: Signature made Tue Oct 13 21:34:30 2026 WIB
gpg: using EDDSA key DF9709E5AC3B6E5920384B075C01CA99559F9B6A
gpg: Good signature from "Budi Santoso <[email protected]>" [ultimate]
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 21:34:30 2026 +0700
Commit awal ditandatanganiTiga baris gpg itu intinya: tanda tangan dibuat pada waktu tertentu (waktu di mesin pembaca berbeda), dengan kunci yang ID lengkapnya tercantum, dan hasilnya Good signature dari pemilik kunci. Penanda [ultimate] berarti keyring yang memverifikasi juga memegang kunci privatnya — kita memverifikasi commit sendiri. Di mana tanda tangannya disimpan? Di dalam objek commit itu sendiri:
git cat-file -p HEADtree 37ce24c20d55c6a121d3747053544b5d654d8a5a
author Budi Santoso <[email protected]> 1791902070 +0700
committer Budi Santoso <[email protected]> 1791902070 +0700
gpgsig -----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQTflwnlrDtuWSA4SwdcAcqZVZ+bagUCas5BdgAKCRBcAcqZVZ+b
ajh3AQCaUQt/AtYIsxtk0UQCZ9j6VqSXrkE6tQSdHUkVe/HmqAD/VblsUsvqSgUw
idWp5ExTor+c+G9uZ56sEqe5/PQn/AI=
=oLAc
-----END PGP SIGNATURE-----
Commit awal ditandatanganiField gpgsig menjadi bagian objek commit — hash commit dihitung setelah tanda tangan menyatu, sehingga tanda tangan ikut terikat pada identitas commit. Isi blok signature berbeda setiap pembuatan meski commit-nya sama, karena GPG menyematkan waktu dan nonce acak.
Verifikasi dari Sisi Orang Lain #
Pembaca lain — Siti — meng-clone repository lalu memverifikasi HEAD-nya dengan keyring sendiri yang masih kosong:
git log --show-signature -1commit 072a74f9ce6746386046e196889cf91fa085dcff
gpg: keybox '/home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-siti/pubring.kbx' created
gpg: Signature made Tue Oct 13 21:34:30 2026 WIB
gpg: using EDDSA key DF9709E5AC3B6E5920384B075C01CA99559F9B6A
gpg: Can't check signature: No public key
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 21:34:30 2026 +0700
Perbarui catatan tanpa -STanpa kunci publik penandatangan, verifikasi berhenti di Can't check signature: No public key — tanda tangannya ada dan valid bentuknya, tetapi tidak ada siapa pun untuk dicocokkan. Kunci publik diekspor lalu diserahkan ke Siti:
gpg --export --armor 5C01CA99559F9B6A > budi.pub-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEas5BdRYJKwYBBAHaRw8BAQdA0exlFC7abwYpSJlaEG3i3GC4YpeBvUohI1mF
EbOC+R+0H0J1ZGkgU2FudG9zbyA8YnVkaUBleGFtcGxlLmNvbT6IkAQTFgoAOBYh
(dipotong)Siti mengimpornya ke keyring-nya — di dunia nyata serah-terima seperti ini berlangsung lewat keyserver, situs profil, atau fitur platform: GitHub dapat menyimpan kunci GPG publik dan menampilkan lencana Verified pada commit yang tanda tangannya cocok, seperti dijelaskan di dokumentasi verifikasi tanda tangan commit GitHub :
gpg --import budi.pubgpg: /home/z/my-project/tutorial-extracted/work/sandbox/keamanan-dan-akses/part-b/gpg-siti/trustdb.gpg: trustdb created
gpg: key 5C01CA99559F9B6A: public key "Budi Santoso <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1Verifikasi ulang di clone Siti kini berhasil:
git log --show-signature -1commit 072a74f9ce6746386046e196889cf91fa085dcff
gpg: Signature made Tue Oct 13 21:34:30 2026 WIB
gpg: using EDDSA key DF9709E5AC3B6E5920384B075C01CA99559F9B6A
gpg: Good signature from "Budi Santoso <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: DF97 09E5 AC3B 6E59 2038 4B07 5C01 CA99 559F 9B6A
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 21:34:30 2026 +0700
Perbarui catatan tanpa -SPerbedaannya jelas: tanda tangan Good, tetapi trust-nya [unknown] — Siti memegang kunci publik tanpa jaminan kunci itu milik Budi sungguhan. Fingerprint di baris terakhir adalah alat pencocokan manual: Budi membacakan fingerprint-nya secara terpisah (tatap muka, kanal lain) dan Siti mencocokkannya. Dari kunci yang sama, level trust naik dengan gpg --lsign-key; level kepercayaan adalah keputusan sosial, bukan fitur otomatis.
Menandatangani Semua Commit #
Mengetik -S pada setiap commit itu rawan lupa. Konfigurasi commit.gpgsign true membalik default: setiap commit ditandatangani kecuali dinyatakan --no-gpg-sign:
git config commit.gpgsign true
git commit -am "Perbarui catatan tanpa -S"Format %G? pada git log merangkum status tanda tangan tiap commit — G berarti tervalidasi:
git log --pretty=format:'%h %G? %an %s'072a74f G Budi Santoso Perbarui catatan tanpa -S
ae01253 G Budi Santoso Commit awal ditandatanganiCommit kedua dibuat tanpa -S namun tetap bertanda tangan. Nilai %G? yang lain: N (tanpa tanda tangan), B (tanda tangan rusak), U (tidak bisa dicek karena kredibilitas kunci).
| Aspek | Commit biasa | Signed commit |
|---|---|---|
| Identitas penulis | teks bebas, bisa dipalsukan | terkunci ke kunci privat |
| Integritas isi | dijamin hash — tapi tanpa penulis terverifikasi | dijamin tanda tangan + hash |
| Biaya | nol | setup kunci + GPG di tiap mesin |
| Keterlihatan di platform | badge “Unverified” bila ada kebijakan verifikasi | badge “Verified” bila kunci terdaftar |
| Verifikasi orang lain | tidak mungkin | perlu kunci publik penandatangan |
Kunci latihan ed25519 tadi lahir lewat satu baris --quick-gen-key. Untuk kunci yang dipakai bertahun-tahun, kita butuh kendali penuh: algoritma, subkey terpisah untuk enkripsi, masa berlaku, dan rotasi tanpa kehilangan verifikasi riwayat lama — semuanya dibedah di chapter berikutnya.