Bỏ qua để đến nội dung
getnextpdf.com

Cách một chữ ký số chứng minh ai đã ký

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

Một chữ ký số làm ba việc, và đáng để giữ chúng tách bạch ngay từ đầu: nó chứng minh các byte không bị thay đổi, nó chứng minh ai đã ký chúng, và — với một chút trợ giúp — nó chứng minh khi nào. Trang này dựng ý tưởng đó từ con số không, để mật mã học thôi không còn là một hộp đen.

“Đã ký” là một từ mà người ta đặt cược các quyết định lên đó. Một hợp đồng, một hóa đơn, một ghi chú phát hành cho phần mềm mà ai đó sẽ chạy. Nếu bạn chỉ biết rằng một công cụ đã in ra một dấu tích xanh, bạn thực sự không biết điều gì đã được chứng minh. Bạn có thể có bằng chứng các byte còn nguyên vẹn nhưng không biết khóa của ai đã ký chúng. Bạn có thể có một người ký thật nhưng một chứng thư đã hết hạn nhiều năm trước. Hiểu các thành phần là điều cho phép bạn nói, một cách chính xác, một chữ ký hợp lệ nghĩa là gì — và, cũng hữu ích không kém, nó không nghĩa là gì.

Hãy hình dung một phong bì có dấu hiệu chống can thiệp với một con dấu cá nhân ấn vào nắp.

  • Con dấu là duy nhất với một người và thực tế là không thể làm giả. Bất cứ ai cũng nhận ra nó; chỉ chủ nhân mới làm ra nó được. Đó là cặp khóa: một khóa riêng chỉ bạn nắm giữ, và một khóa công khai mà ai cũng thấy.
  • Bạn không ấn con dấu lên toàn bộ tài liệu. Bạn ấn nó lên một bản tóm tắt nhỏ, không thể làm giả của tài liệu — một băm. Thay đổi một byte của tài liệu thì bản tóm tắt thay đổi hoàn toàn, nên con dấu không còn khớp nữa.
  • là việc tạo ra một chữ ký trên tài liệu bằng khóa riêng của bạn — trên băm với RSA và ECDSA, hoặc trên chính nội dung với EdDSA, vốn tự băm bên trong. Xác minh là chạy phép kiểm tra của thuật toán với khóa công khai của bạn, chữ ký, và cùng một nội dung (dưới dạng một băm, hoặc trực tiếp) — nó trả về hợp lệ hoặc không hợp lệ. Toán học, không phải lòng tin, nối kết hai thứ.
  • Một chứng thư là phần nói rằng con dấu này là của ai. Không có nó, bạn đã chứng minh một khóa đã ký các byte, nhưng không chứng minh khóa đó thuộc về một ai cụ thể.
  • Một dấu thời gian là phần nói rằng khi nào. Đồng hồ của riêng người ký chỉ là một lời tuyên bố; thời gian tin cậy đến từ một thẩm quyền bên ngoài.

Hãy bắt đầu với băm, vì mọi thứ khác đứng trên nó. Một hàm băm mật mã đọc bất kỳ lượng dữ liệu nào và tạo ra một dấu vân tay ngắn, có độ dài cố định — với một chữ ký PDF, thường là một giá trị 256-bit. Hai thuộc tính khiến nó hữu dụng: cùng một đầu vào luôn cho ra cùng một dấu vân tay, và không khả thi để tìm một đầu vào khác có cùng dấu vân tay. Vậy nên một băm là một vật thay thế trung thành cho tài liệu. Nếu hai băm khớp, các byte khớp.

Giờ đến cặp khóa. Một khóa riêng và một khóa công khai liên kết về mặt toán học, nhưng bạn không thể suy ra cái này từ cái kia trong bất kỳ khoảng thời gian thực tế nào. Chỉ khóa riêng mới có thể tạo ra một chữ ký hợp lệ, và chỉ khóa công khai khớp mới có thể kiểm tra nó. Việc ký dùng sự bất đối xứng đó: người ký áp dụng một phép toán khóa-riêng lên đầu vào mà thuật toán đã chọn định nghĩa — băm của nội dung với RSA và ECDSA, hoặc trực tiếp nội dung với EdDSA, vốn băm bên trong. Kết quả là giá trị chữ ký. Vì chỉ người nắm giữ khóa riêng mới có thể tạo ra nó, và vì nó được gắn với nội dung này, nó chứng minh hai điều cùng lúc — người nắm giữ đã ký, và các byte không hề dịch chuyển kể từ đó.

Việc xác minh phản chiếu logic đó. Bên xác minh tái dựng cùng một đầu vào — băm tài liệu với RSA và ECDSA, hoặc lấy trực tiếp nội dung với EdDSA — rồi chạy phép verify của thuật toán chữ ký trên khóa công khai, giá trị chữ ký, và đầu vào đó. Phép toán trả về hợp lệ hoặc không hợp lệ — và đây là cùng một hình hài dù thuật toán là RSA, ECDSA, hay EdDSA, dù chỉ RSA có thể được hình dung là theo nghĩa đen “khôi phục” lại băm. Hợp lệ nghĩa là còn nguyên vẹn và xác thực. Không hợp lệ nghĩa là có gì đó đã thay đổi, hoặc dùng sai khóa, và câu trả lời trung thực là không hợp lệ.

  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.
Cách một chữ ký số được tạo ra rồi được kiểm tra, từ nguyên lý đầu tiên. Người ký tạo ra một chữ ký trên nội dung bằng khóa riêng của họ — trên một băm với RSA và ECDSA, hoặc trực tiếp trên nội dung với EdDSA; bên xác minh tái dựng cùng một đầu vào, rồi chạy phép verify của thuật toán trên khóa công khai, chữ ký, và đầu vào đó. Một kết quả hợp lệ chứng minh các byte còn nguyên vẹn và rằng người nắm giữ khóa riêng đã ký chúng.

Trong một PDF thực, NextPDF không ấn con dấu lên trang nhìn thấy được — nó ấn nó lên một dải byte đã được khai báo, và đóng gói chữ ký thành một đối tượng CMS tách rời (Spec: RFC 5652) đặt bên trong tập tin (Spec: ISO 32000-2, §12.8). Một điểm tinh chỉnh quan trọng: người ký không ký trực tiếp lên băm nội dung thô. Nó ký một tập nhỏ các thuộc tính được kýbao gồm băm của nội dung, nên thời gian, kiểu nội dung, và định danh chứng thư của người ký đều được niêm phong cùng nhau. Những byte đó nằm ở đâu, và vì sao dải byte có hình hài như vậy, là chủ đề của Cách chữ ký nằm trong một PDF.

Cho đến giờ, toán học chứng minh một khóa đã ký các byte này. Nó không nói gì về khóa của ai. Khoảng trống đó chính xác là điều một chứng thư lấp đầy. Một chứng thư tự thân nó là một tuyên bố đã được ký — từ một thẩm quyền cấp chứng thư — rằng khóa công khai này thuộc về chủ thể có tên này. Tin tưởng nó nghĩa là lần theo chuỗi từ chứng thư của người ký lên đến một thẩm quyền mà bạn đã quyết định tin tưởng, kiểm tra tính hợp lệ của từng mắt xích dọc đường (Spec: RFC 5280, §6). Không có chuỗi đó, “đã ký” là vô danh. Có nó, “đã ký” có một cái tên.

Mảnh cuối cùng là khi nào. Một chữ ký có thể nhúng thời gian do chính người ký tuyên bố, nhưng một đồng hồ bạn không kiểm soát là một lời tuyên bố, không phải một bằng chứng. Một dấu thời gian từ một Time-Stamp Authority gắn một băm của chữ ký vào một khoảnh khắc, được chứng thực bởi một bên không có lợi ích gì trong tài liệu (Spec: RFC 3161, §1). Đó là điều cho phép một chữ ký vẫn còn ý nghĩa sau khi chứng thư của người ký hết hạn: bạn có thể chứng tỏ chữ ký đã tồn tại trong khi chứng thư vẫn còn hợp lệ. Phần xử lý sâu hơn nằm trong Dấu thời gian và thời gian tin cậy.

Các hình hài bên dưới là các phép toán mang tính khái niệm, được viết một cách thẳng thắn. Điểm mấu chốt không phải một lệnh gọi API — mà là thấy rằng signverify là ảnh phản chiếu của nhau, và rằng một byte bị can thiệp phá vỡ sự khớp ngay từ cấu trúc.

<?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.

Giả mạo một thay đổi mà vẫn xác minh được là không khả thi về mặt tính toán. Băm mang nội dung một cách trung thành, nên thay đổi nội dung thì thay đổi băm, và phép verify từ chối nó — trừ khi tìm được một va chạm băm, điều mà hàm đã chọn được thiết kế để khiến trở nên bất khả thi trên thực tế.

Sai lầm thường gặp là đọc “chữ ký hợp lệ” thành “tài liệu đáng tin cậy.” Chúng không phải cùng một câu. Mật mã học chứng minh các byte còn nguyên vẹnngười nắm giữ khóa riêng đã ký chúng — không gì hơn. Một tài liệu được ký bằng một khóa bạn chưa từng nghe đến, được chứng thực bởi không thẩm quyền nào bạn công nhận, có thể “hợp lệ” một cách hoàn hảo mà chẳng đáng giá gì. Danh tính đến từ chứng thư và chuỗi của nó; thời gian đến từ một dấu thời gian tin cậy. Một dấu tích xanh âm thầm gộp tất cả những thứ này vào một boolean đã quyết định, thay cho bạn, câu hỏi nào quan trọng. Biết các thành phần là điều cho phép bạn hỏi phần còn lại.

Trang này giải thích ý tưởng về một chữ ký số, không phải toàn bộ quy trình xác thực. Toán học ở đây chứng minh tính toàn vẹn và tính xác thực. Tự thân nó, nó không cho bạn biết liệu chứng thư ký có được cấp cho người bạn nghĩ hay không, liệu nó có hợp lệ tại thời điểm ký hay không, hay liệu sau đó nó có bị thu hồi hay không — đó là những câu hỏi về đường dẫn chứng thư và về thu hồi, và một sự xác thực đúng đắn chạy tất cả chúng. Bộ kiểm tra đầy đủ nằm trong Xác thực một chữ ký một cách đúng đắn.

NextPDF dựng cấu trúc chữ ký và thực hiện các phép kiểm tra mật mã. Nó không chọn các trust anchor của bạn, không bảo lãnh cho bất kỳ thẩm quyền cấp chứng thư nào, hay quyết định hiệu lực pháp lý của một chữ ký — những thứ đó phụ thuộc vào việc triển khai của bạn, chứng thư, và khu vực tài phán. Engine chứng minh cơ chế; các quyết định tin cậy bên trên nó là của bạn.

Những gì engine xuất xưởng, theo từng tầng, được xây dựng mở rộng ra từ nền tảng này:

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

PAdES B-B: cơ chế băm-và-ký được mô tả ở đây, đóng gói thành một đối tượng CMS SignedData tách rời, cộng thêm xác thực đường dẫn chứng thư theo một trust anchor mà bạn cung cấp.

Pro

Thêm PAdES B-T — một dấu thời gian tin cậy RFC 3161 đã được xác minh trên giá trị chữ ký, nên phần “khi nào” được chứng thực thay vì tự tuyên bố.

Enterprise

Thêm các hồ sơ dài hạn (B-LT, B-LTA): tài liệu xác thực được nhúng và các dấu thời gian tài liệu giữ cho các bằng chứng về danh tính và thời gian còn trả lời được qua nhiều năm.

  • Băm (digest) — một dấu vân tay ngắn, có độ dài cố định của dữ liệu từ một hàm băm mật mã; bất kỳ thay đổi nào đối với dữ liệu cũng thay đổi nó hoàn toàn.
  • Cặp khóa — một khóa riêng liên kết (chỉ do người ký nắm giữ) và một khóa công khai (chia sẻ tự do); chỉ khóa riêng mới ký được, và chỉ khóa công khai khớp mới xác minh được.
  • — áp dụng phép toán khóa-riêng lên đầu vào mà thuật toán định nghĩa: một băm của nội dung với RSA và ECDSA, hoặc trực tiếp nội dung với EdDSA (vốn băm bên trong). Trong một PDF, nội dung đó là các thuộc tính được ký, vốn bao gồm băm của tài liệu. Kết quả là giá trị chữ ký.
  • Xác minh — tái dựng cùng một đầu vào (một băm được tính lại, hoặc trực tiếp nội dung với EdDSA), rồi chạy phép verify của thuật toán trên khóa công khai, giá trị chữ ký, và đầu vào đó để có được câu trả lời hợp-lệ-hay-không.
  • Giá trị chữ ký — các byte mà phép toán khóa-riêng tạo ra; thứ mà một bên xác minh kiểm tra đối chiếu với đầu vào thuật toán vừa được tái dựng (một digest với RSA và ECDSA, chính nội dung với EdDSA).
  • Chứng thư — một tuyên bố đã được ký gắn một khóa công khai với một danh tính có tên; được tin tưởng bằng cách lần chuỗi tới một thẩm quyền bạn chấp nhận (RFC 5280 §6).
  • Trust anchor — một thẩm quyền cấp chứng thư mà bạn đã quyết định tin tưởng; gốc của một chuỗi chứng thư chấp nhận được.
  • Dấu thời gian (RFC 3161) — một token đã được ký từ một Time-Stamp Authority gắn một băm vào một giá trị thời gian, cung cấp bằng chứng tin cậy về khi nào.
  • CMS SignedData — cấu trúc Cryptographic Message Syntax (RFC 5652) mang giá trị chữ ký và chứng thư của người ký.
  • PAdES — PDF Advanced Electronic Signatures: họ hồ sơ ETSI cho việc ký PDF. Được trình bày chi tiết trên các trang về ký.