Lewati ke konten
getnextpdf.com

Bagaimana tanda tangan digital membuktikan siapa yang menandatangani

Spec: RFC 5652Spec: RFC 5280, §6Spec: RFC 3161, §1

Sebuah tanda tangan digital melakukan tiga hal, dan ada baiknya memisahkannya sejak awal: ia membuktikan bita tidak diubah, ia membuktikan siapa yang menandatanganinya, dan — dengan sedikit bantuan — ia membuktikan kapan. Halaman ini membangun gagasan itu dari nol, sehingga kriptografinya berhenti menjadi kotak hitam.

“Ditandatangani” adalah kata yang dijadikan landasan keputusan oleh orang. Sebuah kontrak, sebuah faktur, sebuah catatan rilis untuk perangkat lunak yang akan dijalankan seseorang. Jika Anda hanya tahu bahwa sebuah alat mencetak tanda centang hijau, Anda sebenarnya tidak tahu apa yang dibuktikan. Anda mungkin memiliki bukti bahwa bita-nya utuh tetapi tidak tahu kunci siapa yang menandatanganinya. Anda mungkin memiliki penanda tangan sungguhan tetapi sertifikat yang sudah kedaluwarsa bertahun-tahun lalu. Memahami bagian-bagiannya itulah yang memungkinkan Anda menyatakan, secara presisi, apa makna sebuah tanda tangan yang valid — dan, sama bergunanya, apa yang bukan maknanya.

Bayangkan sebuah amplop tahan-rusak dengan segel pribadi yang ditekankan pada penutupnya.

  • Segel itu unik bagi satu orang dan secara efektif mustahil dipalsukan. Siapa pun dapat mengenalinya; hanya pemiliknya yang dapat membuatnya. Itulah pasangan kunci: sebuah kunci privat yang hanya Anda pegang, dan sebuah kunci publik yang dapat dilihat semua orang.
  • Anda tidak menekankan segel ke seluruh dokumen. Anda menekankannya pada ringkasan dokumen yang sangat kecil dan tak terpalsukan — sebuah hash. Ubah satu bita dokumen dan ringkasannya berubah total, sehingga segelnya tidak lagi cocok.
  • Penandatanganan adalah menghasilkan tanda tangan atas dokumen dengan kunci privat Anda — atas hash untuk RSA dan ECDSA, atau atas konten itu sendiri untuk EdDSA, yang melakukan hashing-nya sendiri di dalam. Verifikasi adalah menjalankan pemeriksaan algoritma dengan kunci publik Anda, tanda tangan, dan konten yang sama (sebagai hash, atau secara langsung) — ia mengembalikan valid atau tidak valid. Matematika, bukan kepercayaan, yang menautkan keduanya.
  • Sebuah sertifikat adalah bagian yang menyatakan segel ini milik siapa. Tanpanya, Anda telah membuktikan bahwa sebuah kunci menandatangani bita-nya, tetapi bukan bahwa kunci itu milik seseorang tertentu.
  • Sebuah stempel waktu adalah bagian yang menyatakan kapan. Jam milik penanda tangan sendiri hanyalah sebuah klaim; waktu tepercaya datang dari otoritas luar.

Mulailah dengan hash, karena segala sesuatu yang lain berdiri di atasnya. Sebuah fungsi hash kriptografis membaca data sebanyak apa pun dan menghasilkan sidik jari yang pendek dan berpanjang tetap — untuk tanda tangan PDF, biasanya nilai 256-bit. Dua properti membuatnya berguna: masukan yang sama selalu menghasilkan sidik jari yang sama, dan tidak layak mencari masukan berbeda dengan sidik jari yang sama. Jadi sebuah hash adalah pengganti setia bagi dokumen. Jika dua hash cocok, bita-nya cocok.

Sekarang pasangan kuncinya. Sebuah kunci privat dan sebuah kunci publik tertaut secara matematis, tetapi Anda tidak dapat menurunkan yang satu dari yang lain dalam waktu praktis berapa pun. Hanya kunci privat yang dapat menghasilkan tanda tangan yang valid, dan hanya kunci publik yang cocok yang dapat memeriksanya. Penandatanganan memanfaatkan asimetri itu: penanda tangan menerapkan operasi kunci-privat pada masukan yang didefinisikan algoritma terpilih — hash konten untuk RSA dan ECDSA, atau konten secara langsung untuk EdDSA, yang melakukan hashing secara internal. Hasilnya adalah nilai tanda tangan. Karena hanya pemegang kunci privat yang bisa menghasilkannya, dan karena ia terikat pada konten ini, ia membuktikan dua hal sekaligus — pemegangnya menandatangani, dan bita-nya tidak berpindah sejak saat itu.

Verifikasi mencerminkan logika itu. Pemverifikasi merekonstruksi masukan yang sama — mem-hash dokumen untuk RSA dan ECDSA, atau mengambil konten secara langsung untuk EdDSA — lalu menjalankan operasi verify algoritma tanda tangan atas kunci publik, nilai tanda tangan, dan masukan itu. Operasi mengembalikan valid atau tidak valid — dan ini adalah bentuk yang sama baik algoritmanya RSA, ECDSA, maupun EdDSA, meskipun hanya RSA yang dapat dibayangkan secara harfiah “memulihkan” hash. Valid berarti utuh dan autentik. Tidak valid berarti ada sesuatu yang berubah, atau kunci yang salah digunakan, dan jawaban jujurnya adalah tidak valid.

  1. Prepare the inputRSA and ECDSA hash the document to a short, fixed-length fingerprint; EdDSA signs the content directly and hashes it internally. Either way, any change to the bytes changes what is signed.
  2. Sign with the private keyThe signer applies a private-key operation to that input — the hash for RSA and ECDSA, the content for EdDSA. The output is the signature value; only the private-key holder could have produced it.
  3. Reconstruct the inputThe verifier independently rebuilds the same input from the content — a recomputed hash for RSA and ECDSA, the content itself for EdDSA. This is what the verify operation checks against.
  4. Verify with the public keyThe verifier runs the algorithm's verify operation on the public key, the signature value, and that input. The same shape works for RSA, ECDSA, and EdDSA.
  5. Accept or rejectThe verify operation returns valid or invalid. Valid means the bytes are intact and the private-key holder signed them. Otherwise the result is invalid — no guessing.
How a digital signature is produced and then checked, from first principles. The signer produces a signature over the content with their private key — over a hash for RSA and ECDSA, or over the content directly for EdDSA; the verifier reconstructs the same input, then runs the algorithm's verify operation on the public key, the signature, and that input. A valid result proves the bytes are intact and that the private-key holder signed them.

Dalam PDF yang sesungguhnya, NextPDF tidak menekankan segel pada halaman yang terlihat — ia menekankannya pada rentang bita yang dideklarasikan, dan mengemas tanda tangan sebagai objek CMS yang terlepas (Spec: RFC 5652) yang ditempatkan di dalam berkas (Spec: ISO 32000-2, §12.8). Satu penghalusan penting: penanda tangan tidak menandatangani hash konten mentah secara langsung. Ia menandatangani sekumpulan kecil signed attributes yang mencakup hash konten, sehingga waktu, jenis konten, dan pengidentifikasi sertifikat penanda tangan semuanya tersegel bersama. Di mana bita-bita itu berada, dan mengapa rentangnya dibentuk sebagaimana adanya, menjadi topik Bagaimana tanda tangan berada di dalam PDF.

Sejauh ini, matematika membuktikan sebuah kunci menandatangani bita-bita ini. Ia tidak mengatakan apa pun tentang kunci siapa. Celah itulah yang persis diisi oleh sebuah sertifikat. Sebuah sertifikat itu sendiri adalah sebuah pernyataan yang ditandatangani — dari sebuah otoritas sertifikat — bahwa kunci publik ini milik subjek bernama ini. Mempercayainya berarti mengikuti rantai dari sertifikat penanda tangan ke atas hingga otoritas yang telah Anda putuskan untuk dipercaya, memeriksa validitas setiap mata rantai sepanjang jalan (Spec: RFC 5280, §6). Tanpa rantai itu, “ditandatangani” bersifat anonim. Dengan rantai itu, “ditandatangani” memiliki nama.

Bagian terakhir adalah kapan. Sebuah tanda tangan dapat menyematkan waktu yang diklaim penanda tangan sendiri, tetapi jam yang tidak Anda kendalikan adalah sebuah klaim, bukan sebuah bukti. Sebuah stempel waktu dari Time-Stamp Authority mengikat hash tanda tangan ke sebuah instan, diatestasi oleh pihak yang tidak berkepentingan atas dokumen (Spec: RFC 3161, §1). Itulah yang membuat sebuah tanda tangan tetap bermakna setelah sertifikat penanda tangan kedaluwarsa: Anda dapat menunjukkan bahwa tanda tangan itu sudah ada ketika sertifikatnya masih valid. Pembahasan lebih mendalam ada di Stempel waktu dan waktu tepercaya.

Bentuk-bentuk di bawah ini adalah operasi konseptual, ditulis dengan jelas. Intinya bukan sebuah pemanggilan API — melainkan melihat bahwa sign dan verify adalah bayangan cermin, dan bahwa satu bita yang dirusak memecahkan kecocokannya secara konstruksi.

<?php
declare(strict_types=1);
// SIGN — the holder of the private key seals the content.
// RSA and ECDSA sign a hash; EdDSA signs the content directly (hashing inside).
$signingInput = sign_input($content); // a digest for RSA/ECDSA, the content for EdDSA
$signatureValue = private_key_transform( // only the key holder can do this
privateKey: $signerPrivateKey,
input: $signingInput,
);
// VERIFY — anyone with the public key runs the algorithm's check.
$recomputedInput = sign_input($content); // verifier rebuilds the same input
$intactAndAuthentic = signature_verify( // RSA, ECDSA, EdDSA — same shape
publicKey: $signerPublicKey, // taken from the certificate
signatureValue: $signatureValue,
input: $recomputedInput, // the freshly reconstructed input
);
// true -> bytes unchanged AND signed by the private-key holder
// false -> a byte changed, or the wrong key — the honest answer is "invalid"
// The certificate answers a SEPARATE question: whose public key is this?
// The timestamp answers ANOTHER: when did this signature exist?
// "intact + authentic" alone proves neither identity nor time.

Memalsukan suatu perubahan yang tetap terverifikasi secara komputasi tidak layak. Hash membawa konten dengan setia, sehingga mengubah konten mengubah hash-nya, dan operasi verify menolaknya — kecuali menemukan tabrakan hash, yang fungsi terpilih dirancang untuk membuatnya tidak praktis.

Kesalahan yang sering muncul adalah membaca “tanda tangan valid” sebagai “dokumen tepercaya.” Keduanya bukan kalimat yang sama. Kriptografi membuktikan bita-nya utuh dan pemegang kunci-privat menandatanganinya — tidak lebih. Sebuah dokumen yang ditandatangani dengan kunci yang tidak pernah Anda dengar, diatestasi oleh otoritas yang tidak Anda kenali, dapat “valid” dengan sempurna dan tidak bernilai apa-apa. Identitas datang dari sertifikat dan rantainya; waktu datang dari stempel waktu tepercaya. Tanda centang hijau yang diam-diam melipat semua ini ke dalam satu boolean telah memutuskan, atas nama Anda, pertanyaan mana yang penting. Mengetahui bagian-bagiannya itulah yang memungkinkan Anda menanyakan sisanya.

Halaman ini menjelaskan gagasan tentang sebuah tanda tangan digital, bukan prosedur validasi yang lengkap. Matematika di sini membuktikan integritas dan autentisitas. Ia tidak, dengan sendirinya, memberi tahu Anda apakah sertifikat penandatanganan diterbitkan untuk siapa yang Anda kira, apakah ia valid pada saat penandatanganan, atau apakah ia kemudian dicabut — itu adalah pertanyaan jalur-sertifikat dan pencabutan, dan sebuah validasi yang benar menjalankan semuanya. Kumpulan pemeriksaan yang lengkap ada di Memvalidasi tanda tangan dengan benar.

NextPDF membangun struktur tanda tangan dan melakukan pemeriksaan kriptografis. Ia tidak memilih trust anchor Anda, tidak menjamin otoritas sertifikat mana pun, atau memutuskan efek hukum sebuah tanda tangan — semua itu bergantung pada penerapan Anda, sertifikatnya, dan yurisdiksinya. Mesin membuktikan mekanismenya; keputusan kepercayaan di atasnya adalah milik Anda.

Apa yang dirilis mesin, per jenjang, dibangun ke luar dari fondasi ini:

Digital signature: integrity, identity, and trusted time — edition availability
EditionAvailability
Core

PAdES B-B: the hash-and-sign mechanism described here, packaged as a detached CMS SignedData object, plus certificate-path validation against a trust anchor you supply.

Pro

Adds PAdES B-T — a verified RFC 3161 trusted timestamp on the signature value, so the “when” is attested rather than self-claimed.

Enterprise

Adds the long-term profiles (B-LT, B-LTA): embedded validation material and document timestamps that keep the identity and time proofs answerable for years.

  • Hash (digest) — sidik jari data yang pendek dan berpanjang tetap dari sebuah fungsi hash kriptografis; setiap perubahan pada data mengubahnya total.
  • Pasangan kunci — sepasang kunci privat (dipegang hanya oleh penanda tangan) dan kunci publik (dibagikan dengan bebas) yang tertaut; hanya kunci privat yang dapat menandatangani, dan hanya kunci publik yang cocok yang dapat memverifikasi.
  • Penandatanganan — menerapkan operasi kunci-privat pada masukan yang didefinisikan algoritma: sebuah hash konten untuk RSA dan ECDSA, atau konten secara langsung untuk EdDSA (yang melakukan hashing secara internal). Dalam PDF, konten itu adalah signed attributes, yang mencakup hash dokumen. Hasilnya adalah nilai tanda tangan.
  • Verifikasi — merekonstruksi masukan yang sama (sebuah hash yang dihitung ulang, atau konten secara langsung untuk EdDSA), lalu menjalankan operasi verify algoritma atas kunci publik, nilai tanda tangan, dan masukan itu untuk mendapatkan jawaban valid-atau-tidak-valid.
  • Nilai tanda tangan — bita yang dihasilkan operasi kunci-privat; apa yang diperiksa seorang pemverifikasi terhadap masukan algoritma yang baru direkonstruksi (sebuah digest untuk RSA dan ECDSA, konten itu sendiri untuk EdDSA).
  • Sertifikat — sebuah pernyataan yang ditandatangani yang mengikat kunci publik ke identitas bernama; dipercaya dengan merantai ke otoritas yang Anda terima (RFC 5280 §6).
  • Trust anchor — sebuah otoritas sertifikat yang telah Anda putuskan untuk dipercaya; akar dari sebuah rantai sertifikat yang dapat diterima.
  • Stempel waktu (RFC 3161) — sebuah token yang ditandatangani dari Time-Stamp Authority yang mengikat hash ke sebuah nilai waktu, memberikan bukti tepercaya tentang kapan.
  • CMS SignedData — struktur Cryptographic Message Syntax (RFC 5652) yang membawa nilai tanda tangan dan sertifikat penanda tangan.
  • PAdES — PDF Advanced Electronic Signatures: keluarga profil ETSI untuk penandatanganan PDF. Dibahas mendalam pada halaman-halaman penandatanganan.