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:

bash
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 never
text
gpg: 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:

bash
gpg --list-secret-keys --keyid-format long
text
gpg: 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:

bash
cd work/sandbox/keamanan-dan-akses/part-b/latihan-signed
git config user.signingkey 5C01CA99559F9B6A
git config --get user.signingkey
text
5C01CA99559F9B6A

Menandatangani 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:

bash
git commit -S -m "Commit awal ditandatangani"

Pemeriksaannya satu perintah:

bash
git log --show-signature -1
text
commit 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 ditandatangani

Tiga 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:

bash
git cat-file -p HEAD
text
tree 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 ditandatangani

Field 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:

bash
git log --show-signature -1
text
commit 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 -S

Tanpa 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:

bash
gpg --export --armor 5C01CA99559F9B6A > budi.pub
text
-----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 :

bash
gpg --import budi.pub
text
gpg: /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: 1

Verifikasi ulang di clone Siti kini berhasil:

bash
git log --show-signature -1
text
commit 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 -S

Perbedaannya 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:

bash
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:

bash
git log --pretty=format:'%h %G? %an %s'
text
072a74f G Budi Santoso Perbarui catatan tanpa -S
ae01253 G Budi Santoso Commit awal ditandatangani

Commit 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).

AspekCommit biasaSigned commit
Identitas penulisteks bebas, bisa dipalsukanterkunci ke kunci privat
Integritas isidijamin hash — tapi tanpa penulis terverifikasidijamin tanda tangan + hash
Biayanolsetup kunci + GPG di tiap mesin
Keterlihatan di platformbadge “Unverified” bila ada kebijakan verifikasibadge “Verified” bila kunci terdaftar
Verifikasi orang laintidak mungkinperlu 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.