Giới thiệu
Bạn đã bao giờ tự hỏi cách thức hoạt động của một quy trình chữ ký số chưa? Khi nói đến tài liệu số, câu hỏi đặt ra là: làm thế nào để đảm bảo rằng tệp tin này là xác thực và không bị thay đổi? Chính vì lý do này mà chữ ký số ra đời.
Khái niệm cơ bản rất đơn giản: bạn tạo ra một hash của tài liệu (một loại “dấu vân tay”) và sử dụng khóa riêng của bạn để ký lên hash đó. Người nhận tài liệu có thể sử dụng khóa công khai tương ứng để xác minh xem chữ ký có hợp lệ hay không. Như vậy, chúng ta có hai đảm bảo:
- Tài liệu không bị thay đổi.
- Chữ ký chỉ có thể đến từ chủ sở hữu khóa riêng.
Trong trường hợp PDF — hãy nghĩ đến các hợp đồng hoặc bất kỳ tài liệu nào có giá trị pháp lý — điều này càng trở nên quan trọng hơn. Tại Việt Nam, chữ ký số cũng được quy định bởi pháp luật, đảm bảo tính hợp pháp cho các tài liệu được ký điện tử.
Và giờ đây, chúng ta sẽ cùng khám phá Elixir. Với việc chạy trên máy ảo Erlang (BEAM), ngôn ngữ này đã cung cấp các công cụ mã hóa sẵn có, sẵn sàng để sử dụng. Điều này có nghĩa là bạn không cần phải sử dụng thư viện bên ngoài để bắt đầu làm việc với các khóa và chữ ký số.
Mời Bạn Bắt Đầu: Ký Tài Liệu Trong Elixir
1. Tạo một cặp khóa
Bước đầu tiên: tạo cặp khóa RSA (khóa riêng và khóa công khai). Với chúng, chúng ta sẽ ký và xác thực các tài liệu.
elixir
# Tạo một cặp khóa RSA với 2048 bit
{:ok, rsa_key} = :public_key.generate_key({:rsa, 2048, 65537})
{:RSAPrivateKey, _, modulus, public_exp, _private_exp, _, _, _, _} = rsa_key
# private_key là khóa bạn nên giữ bí mật tuyệt đối. Nó không bao giờ nên được chia sẻ.
public_key = {:RSAPublicKey, modulus, public_exp}
# public_key là khóa có thể được phân phối cho bất kỳ ai cần xác thực chữ ký của bạn.
private_key = rsa_key
Vậy là chúng ta đã có hai khóa trong tay.
⚠️ Lưu ý: trong một hệ thống thực tế, khóa riêng này không nên nằm trong mã nguồn hoặc các tệp tin đơn giản. Bạn nên sử dụng các loại kho lưu trữ an toàn như HashiCorp Vault.
2. Tạo hash cho một tệp PDF
Trước khi ký, chúng ta cần chuyển đổi nội dung của tệp thành một hash. Hash này sẽ là cơ sở của chữ ký.
elixir
pdf_content = File.read!("hopdong.pdf")
# Hash là dấu vân tay của tài liệu (chúng ta có thể nói rằng đây là một tóm tắt mã hóa).
hash = :crypto.hash(:sha256, pdf_content)
Nếu bạn thay đổi một dấu phẩy trong PDF? Hash sẽ thay đổi hoàn toàn. Điều này đảm bảo tính toàn vẹn của tài liệu.
⚠️ Lưu ý: luôn sử dụng các thuật toán hash được coi là an toàn. Tránh MD5 hoặc SHA-1, vì chúng đã bị phá vỡ và không còn đáng tin cậy cho chữ ký số.
3. Ký bằng khóa riêng
Khi đã có hash, giờ chỉ cần ký:
elixir
# Chúng ta đang áp dụng khóa riêng lên hash.
signature = :public_key.sign(hash, :sha256, private_key)
Kết quả, signature, là một chuỗi byte chứng minh rằng bạn (và chỉ bạn) có thể tạo ra chữ ký này, vì chỉ bạn mới có khóa riêng. signature này sẽ đi kèm với tài liệu, chứng minh rằng người ký đã sử dụng khóa riêng đúng.
⚠️ Lưu ý: Thông thường, chữ ký này được lưu riêng biệt với tệp (như một tệp .sig) hoặc được nhúng vào siêu dữ liệu của PDF. Như vậy, tài liệu vẫn giữ nguyên trạng thái ban đầu.
4. Xác thực bằng khóa công khai
Người nhận tài liệu cần kiểm tra xem mọi thứ có ổn không:
elixir
# Ở đây, chúng ta sử dụng khóa công khai để xác thực chữ ký.
valid? = :public_key.verify(hash, :sha256, signature, public_key)
# Nếu valid? là true, chúng ta có hai đảm bảo: tài liệu không bị thay đổi và đã được ký bởi người thực sự sở hữu khóa riêng tương ứng.
if valid? do
IO.puts("Tất cả đều ổn: chữ ký hợp lệ và tài liệu nguyên vẹn.")
else
IO.puts("Có vấn đề! Chữ ký không hợp lệ hoặc tài liệu đã bị thay đổi.")
end
⚠️ Lưu ý: luôn xác thực hash trước khi tin tưởng vào tài liệu. Không chỉ cần “trông” như đã ký; cần phải xác nhận một cách mã hóa.
Thật đơn giản phải không?!
5. Mở rộng quy trình
Quy trình cơ bản này đã đảm bảo rất nhiều điều. Nhưng trong thế giới thực, quan trọng là mở rộng ở các điểm sau:
- Nhiều chữ ký trong một PDF, mỗi chữ ký có con dấu riêng.
- Siêu dữ liệu trong chính PDF, lưu trữ chữ ký, chứng chỉ và tất cả những điều khác.
- Dấu thời gian, để chứng minh không chỉ rằng tài liệu là hợp lệ, mà còn là khi nào nó được ký.
Những điểm này rất hữu ích trong các tình huống pháp lý hoặc tài chính, nơi mỗi chi tiết đều có thể tạo ra sự khác biệt.
Kết luận
Chữ ký số rất cần thiết để đảm bảo tính xác thực, tính toàn vẹn và tính hợp pháp của tài liệu. Chúng ta đã thấy cách mà Elixir + Erlang làm cho quá trình này trở nên đơn giản và đáng tin cậy: chỉ với vài dòng mã, chúng ta có thể tạo ra các khóa, ký và xác thực tài liệu, với sự mạnh mẽ của một nền tảng trưởng thành.
Chúng ta đã hiểu khái niệm chữ ký số, cách tạo khóa RSA, cách tạo và ký hash của một PDF và cách xác thực chữ ký này. Câu hỏi từ phần giới thiệu đã được giải đáp: quy trình chữ ký số hoạt động như thế nào? Giờ đây, chúng ta đã có câu trả lời rõ ràng — nó bao gồm việc tạo ra một hash, ký với khóa riêng và xác thực với khóa công khai.
Tóm lại, không chỉ thể hiện sự linh hoạt của Elixir trong thế giới mã hóa, chúng ta đã phân tích một quy trình mà thực sự đơn giản hơn nhiều so với vẻ bề ngoài của nó.
Cuối cùng, quy trình chữ ký số chỉ đơn giản là hash + khóa riêng + khóa công khai — đơn giản trong lý thuyết, nhưng mạnh mẽ trong thực tế.