SIGNEDSHA-256 digest signed with Ed25519

Chữ ký số

10 đọc tối thiểumật mã

Mọi bản cập nhật phần mềm bạn cài đặt, mọi bản PDF có chữ ký, mọi mã thông báo JWT, mọi cam kết mã được đẩy đến kho lưu trữ Git chính, mọi chứng chỉ TLS cho phép trình duyệt của bạn tin cậy một trang web — tất cả đều được xác minh bằng chữ ký điện tử. Nguyên thủy mật mã là một trong những công cụ hữu ích nhất mà điện toán hiện đại có và nó trả lời một câu hỏi cụ thể: phần dữ liệu chính xác này có đến từ thực thể cụ thể này, không bị thay đổi không?

Toàn bộ nội dung bài viết được cung cấp bằng tiếng Anh bên dưới.

A chữ ký số là một hoạt động mã hóa chứng minh một phần dữ liệu được tạo ra bởi người nắm giữ khóa riêng tư cụ thể và dữ liệu đó chưa bị sửa đổi kể từ đó. Nó là dạng tương tự kỹ thuật số của chữ ký viết tay trên giấy, nhưng có sự đảm bảo mạnh mẽ hơn nhiều: chữ ký được liên kết về mặt toán học với dữ liệu và việc giả mạo nó mà không có khóa riêng là không thể thực hiện được về mặt tính toán.

Ba thuộc tính

A chữ ký số cung cấp:

  • Authenticity — bằng chứng người ký giữ quyền riêng tư tương ứng key.
  • Integrity — mọi sửa đổi đối với dữ liệu đã ký sẽ làm mất hiệu lực chữ ký.
  • Non-repudiation — người ký sau đó không thể phủ nhận một cách đáng tin cậy việc đã ký, bởi vì bất kỳ ai có khóa chung đều có thể xác minh và chỉ người giữ khóa riêng mới có thể tạo ra chữ ký.

Cách ký thực sự hoạt động

Ý tưởng ngây thơ — "mã hóa dữ liệu bằng khóa riêng" — nắm bắt được tinh thần nhưng không nắm bắt được chi tiết. Lược đồ chữ ký thực băm dữ liệu trước, sau đó thực hiện thao tác ký trên hàm băm. Băm là điều cần thiết: các thao tác ký diễn ra chậm và hoạt động trên các đầu vào nhỏ nhưng dữ liệu được ký có thể là megabyte hoặc gigabyte. Hàm băm nén dữ liệu có kích thước tùy ý thành một bản tóm tắt có kích thước cố định, sau đó được ký.

Luồng:

  1. Compute h = SHA-256(data) (hoặc hàm băm an toàn khác).
  2. Ký hàm băm bằng khóa riêng: sig = sign(h, priv).
  3. Phân phối (dữ liệu, sig).

Để xác minh:

  1. Tính toán h' = SHA-256(dữ liệu).
  2. Xác minh verify(h', sig, pub) == true.

Nếu có bất kỳ điều gì trong dữ liệu thay đổi, h' sẽ khác với h và quá trình xác minh không thành công. Nếu chữ ký được tạo bởi bất kỳ ai không phải là người nắm giữ khóa riêng phù hợp thì việc xác minh sẽ không thành công.

Thuật toán chữ ký phổ biến

  • RSA với PSS hoặc PKCS#1 v1.5 đệm — cũ hơn nhưng vẫn được triển khai rộng rãi. PSS là đề xuất hiện đại.
  • ECDSA trên đường cong NIST (P-256, P-384) — phổ biến trong TLS và ký mã.
  • Ed25519 — sơ đồ chữ ký hiện đại được thiết kế để đảm bảo an toàn và tốc độ. Hiện là mặc định trong OpenSSH, Signal, nhiều triển khai TLS.
  • SLH-DSA, ML-DSA — sơ đồ chữ ký sau lượng tử; được NIST chuẩn hóa vào năm 2024 (SLH-DSA dựa trên hàm băm / SPHINCS+, ML-DSA dựa trên mạng / CRYSTALS-Dilithium).

Khi bạn gặp chữ ký số

  • TLS chứng chỉ. Mọi chứng chỉ đều được ký bằng khóa riêng của Tổ chức phát hành chứng chỉ, xác nhận cho sự ràng buộc giữa miền và khóa chung.
  • Cập nhật phần mềm. Hệ điều hành và trình quản lý gói xác minh chữ ký trên các gói đã tải xuống trước khi cài đặt. macOS, Windows, Debian, Arch — tất cả đều từ chối các gói chưa được ký từ các kênh chính thức.
  • Code ký. Authenticode (Windows), ID nhà phát triển Apple, ký APK Android — chữ ký liên kết các tệp thực thi với nhà phát triển của họ.
  • Git ký cam kết. PGP hoặc chữ ký dựa trên SSH trên các cam kết và thẻ; GitHub hiển thị "Đã xác minh."
  • JWT và mã thông báo OAuth. Xác nhận danh tính được ký bởi cơ quan phát hành.
  • Giao dịch tiền điện tử. Mọi giao dịch Bitcoin hoặc Ethereum đều được ký bởi khóa riêng của chủ sở hữu.
  • Các tệp PDF và email. S/MIME, PAdES và thư có chữ ký PGP.

Quản lý khóa là phần cứng

Mật mã đã được giải quyết. Thách thức vận hành là bảo vệ và luân chuyển các khóa riêng mà không bị gián đoạn dịch vụ. Khóa ký mã bị rò rỉ là thảm họa - kẻ tấn công có thể ký phần mềm độc hại tùy ý mà hệ điều hành sẽ tin cậy. Các phương pháp hay nhất hiện đại:

  • Tạo khóa riêng bên trong mô-đun bảo mật phần cứng (HSM) — khóa không bao giờ tồn tại bên ngoài chip chuyên dụng.
  • Tách khóa ký khỏi khóa nhận dạng dài hạn (gốc ngoại tuyến, ký trung gian trực tuyến).
  • Xoay vòng khóa ký theo lịch trình thường xuyên; xuất bản thu hồi khi bị xâm phạm.
  • Kiểm tra mọi thao tác ký.

Xác minh chữ ký chính xác

Ba cạm bẫy tinh vi đã gây ra CVE thực:

  • Xác minh khóa sai. Chữ ký chỉ đáng tin cậy khi bạn tin rằng khóa chung là đúng. Xác minh ngoài băng tần, nhật ký minh bạch chính hoặc tin cậy khi sử dụng lần đầu là những câu trả lời thực tế.
  • Tin cậy vào trường thuật toán. Một số định dạng mã thông báo (JWT ban đầu) cho phép người ký chỉ định thuật toán. Những kẻ tấn công khai thác điều này bằng cách tuyên bố "alg=none" và bỏ qua hoàn toàn việc xác minh chữ ký. Người xác minh phải ghim thuật toán dự kiến.
  • Không xác minh được chữ ký bao gồm đúng dữ liệu. Chữ ký trên hàm băm của tài liệu sẽ không chứng minh được điều gì nếu bạn có thể hoán đổi tài liệu nào được trình bày cho chữ ký nào.

Đúng vậy, chữ ký số là nền tảng của sự tin cậy trên Internet hiện đại.

Câu hỏi thường gặp

Chữ ký số khác với mã hóa như thế nào?
Mã hóa giữ bí mật dữ liệu. Việc ký chứng minh nguồn gốc và tính toàn vẹn của dữ liệu nhưng không che giấu nó. Nhiều giao thức kết hợp cả hai: mã hóa để giữ nội dung ở chế độ riêng tư, ký để chứng minh tính xác thực. Họ sử dụng các khóa khác nhau, thường là các thuật toán khác nhau.
Chữ ký số có thể bị giả mạo?
Không phải không có khóa riêng. Độ mạnh của mật mã giống như độ mạnh cơ bản (Ed25519 về cơ bản là không thể giả mạo trong thực tế). Các đường dẫn giả mạo thực tế: đánh cắp khóa riêng, khai thác các trình tạo số ngẫu nhiên yếu trong quá trình ký (chế độ lỗi cổ điển của ECDSA) hoặc ký sai thông qua lỗi xác minh.
Tại sao chúng ta băm trước khi ký thay vì ký dữ liệu trực tiếp?
Hai lý do: việc ký kết chậm trên đầu vào lớn và thuật toán chữ ký có giới hạn kích thước tin nhắn. Hàm băm nén dữ liệu tùy ý thành một giá trị có kích thước cố định mà thuật toán có thể ký một cách hiệu quả. Thuộc tính bảo mật được giữ nguyên vì hàm băm có khả năng chống va chạm.
Sự khác biệt giữa chữ ký số và chữ ký điện tử là gì?
Chữ ký điện tử là thuật ngữ pháp lý — bất kỳ dấu hiệu nào biểu thị sự đồng ý hoặc quyền tác giả, bao gồm cả việc gõ tên của bạn. Chữ ký số là thuật ngữ mật mã - một phép toán cụ thể. Nhiều chữ ký điện tử không có mật mã; nhiều chữ ký điện tử không được công nhận tại tòa nếu không có buổi lễ bổ sung. Hai thuật ngữ trùng lặp nhưng không phải là từ đồng nghĩa.
Chữ ký số có chứng minh ngày tài liệu được ký không?
Không phải tự nó. Bạn cần có dấu thời gian được tin cậy <em></em> từ Cơ quan đóng dấu thời gian hoặc công chứng thông qua dịch vụ đánh dấu thời gian công khai (OpenTimestamps ghi vào chuỗi khối của Bitcoin). Chỉ riêng việc ký tên đã chứng tỏ “chữ ký này đã được tạo ra vào một thời điểm nào đó trước đây”, chứ không phải vào thời điểm cụ thể nào.
Giải thích về Chữ ký số: Tính xác thực và tính không thoái thác trong một hoạt động mã hóa