PGP là giao thức để xác thực

I. Giới thiệu

OpenPGP là một giao thức không độc quyền để mã hóa giao tiếp email bằng mật mã khóa công khai. Nó dựa trên phần mềm PGP (Pretty Good Privacy) ban đầu. Giao thức OpenPGP xác định các định dạng chuẩn cho tin nhắn, chữ ký và chứng chỉ được mã hóa để trao đổi khóa chung.

Pretty Good Privacy được phát triển bởi nhà khoa học Phil Zimmerman vào năm 1991. Phil Zimmerman chính là người muốn tạo ra một nền tảng mã hóa nguồn mở có thể được sử dụng bởi bất kỳ ai trên thế giới mà không phải trả những khoản phí quá lớn. Cái tên được lấy cảm hứng từ cửa hàng tạp hóa địa phương Zimmerman, Ralph's Pretty Good Grocery. Sau khi phát hành công khai vào năm 1993, PGP đã được sử dụng rộng rãi như một tiêu chuẩn cho mã hóa. Zimmerman lần đầu tiên phát hành các file cho cư dân tại Hoa Kỳ (tải xuống qua FTP). Tuy nhiên, nhà khoa học Phil Zimmerman muốn bất kỳ ai cũng có cơ hội tải xuống các file này, cho dù họ đang sống ở đâu. Một bản cập nhật đã được phát hành vào năm 1996, nhưng chính phủ Mỹ lại cố gắng ngăn nó phổ biến rộng rãi với lý do Zimmerman không có giấy phép xuất ra khỏi lãnh thổ nước Mỹ theo quy định.

Zimmerman đã phát hành bản cập nhật vào năm 1996 thông qua công ty do ông thành lập, PGP Inc. 14 năm sau, Zimmerman bán PGP Inc cho tập đoàn bảo mật khổng lồ Symantec Group. Đây cũng là nhà phát triển phần mềm diệt virus hiện chịu trách nhiệm cập nhật PGP để bảo vệ thông tin liên lạc qua email. Symantec Group cũng đã phát triển một biến thể nguồn mở - OpenPGP, được sử dụng cùng với phiên bản được cấp phép.

II. Đặc điểm OpenPGP

OpenPGP là một trong những phần mềm được cung cấp rộng rãi đầu tiên để triển khai mật mã khóa công khai. Nó là một hệ thống mật mã kết hợp, sử dụng cả mã hóa đối xứng và mã hóa bất đối xứng để bảo đảm mức độ bảo mật cao.

PGP sử dụng kết hợp mật mã hóa khóa công khai và thuật toán khóa đối xứng cộng thêm với hệ thống xác lập mối quan hệ giữa khóa công khai và chỉ danh người dùng (ID). Phiên bản đầu tiên của hệ thống này thường được biết dưới tên mạng lưới tín nhiệm dựa trên các mối quan hệ ngang hàng (khác với hệ thống X.509 với cấu trúc cây dựa vào các nhà cung cấp chứng thực số). Các phiên bản PGP về sau dựa trên các kiến trúc tương tự như hạ tầng khóa công khai.

PGP sử dụng thuật toán mật mã hóa khóa bất đối xứng. Trong các hệ thống này, người sử dụng đầu tiên phải có một cặp khóa: khóa công khai và khóa bí mật. Người gửi sử dụng khóa công khai của người nhận để mã hóa một khóa chung (còn gọi là khóa phiên) dùng trong các thuật toán mật mã hóa khóa đối xứng. Khóa phiên này chính là khóa để mật mã hóa các thông tin được gửi qua lại trong phiên giao dịch. Rất nhiều khóa công khai của những người sử dụng PGP được lưu trữ trên các máy chủ khóa PGP trên khắp thế giới (các máy chủ mirror lẫn nhau).

Người nhận trong hệ thống PGP sử dụng khóa phiên để giải mã các gói tin. Khóa phiên này cũng được gửi kèm với thông điệp nhưng được mật mã hóa bằng hệ thống mật mã bất đối xứng và có thể tự giải mã với khóa bí mật của người nhận. Hệ thống phải sử dụng cả hai dạng thuật toán để tận dụng ưu thế của cả hai: thuật toán bất đối xứng đơn giản việc phân phối khóa còn thuật toán đối xứng có ưu thế về tốc độ (nhanh hơn cỡ 1000 lần).

Một chiến lược tương tự cũng được dùng (mặc định) để phát hiện xem thông điệp có bị thay đổi hoặc giả mạo người gửi. Để thực hiện 2 mục tiêu trên người gửi phải ký văn bản với thuật toán RSA hoặc DSA. Đầu tiên, PGP tính giá trị hàm băm của văn bản đó rồi tạo ra chữ ký số với khóa bí mật của người gửi và gửi cả văn bản và chữ ký số đến người nhận. Khi nhận được văn bản, người nhận tính lại giá trị băm của văn bản đó đồng thời giải mã chữ ký số bằng khóa công khai của người gửi. Nếu 2 giá trị băm này giống nhau thì có thể khẳng định (với xác suất rất cao) là văn bản chưa bị thay đổi kể từ khi gửi và người gửi đúng là người sở hữu khóa bí mật tương ứng.

Trong các đặc tả gần đây của OpenPGP, các chữ ký tin cậy có thể được sử dụng để tạo ra các nhà cung cấp chứng thực số (CA). Một chữ ký tin cậy có thể chứng tỏ rằng một khóa thực sự thuộc về một người sử dụng và người đó đáng tin cậy để ký xác nhận một khóa của mức thấp hơn. Một chữ ký có mức 0 tương đương với chữ ký trong mô hình mạng lưới tín nhiệm. Chữ ký ở mức 1 tương đương với chữ ký của một CA vì nó có khả năng xác nhận cho một số lượng không hạn chế chữ ký ở mức 0. Chữ ký ở mức 2 tương tự như chữ ký trong danh sách các CA mặc định trong Internet Explorer; nó cho phép người chủ tạo ra các CA khác.

PGP cũng được thiết kế với khả năng hủy bỏ/thu hồi các chứng thực có khả năng đã bị vô hiệu hóa. Về một khía cạnh nào đó, điều này tương đương với danh sách chứng thực bị thu hồi của mô hình hạ tầng khóa công khai. Các phiên bản PGP gần đây cũng hỗ trợ tính năng hạn sử dụng của chứng thực.

Vấn đề xác định mối quan hệ giữa khóa công khai và người sở hữu không phải là vấn đề riêng của PGP. Tất cả các hệ thống sử dụng cặp khóa công khai và khóa bí mật đều phải đối phó với vấn đề này và cho đến nay chưa có một giải pháp hoàn thiện nào được tìm ra. Mô hình ban đầu của PGP trao cho quyền quyết định cuối cùng người sử dụng còn các mô hình PKI thì quy định tất cả các chứng thực phải được xác nhận (có thể không trực tiếp) bởi một nhà cung cấp chứng thực trung tâm.

Như vậy, OpenPGP sử dụng kết hợp mật mã hóa khóa công khai và thuật toán khóa đối xứng cộng thêm với hệ thống xác lập mối quan hệ giữa khóa công khai và chỉ danh người dùng ID. Người sử dụng đầu tiên phải có một cặp khóa: khóa công khai và khóa bí mật. Người gửi sử dụng khóa công khai của người nhận để mã hóa một khóa chung (còn gọi là khóa phiên). Khóa phiên được dùng để mã hóa dữ liệu còn khóa công khai mã hóa chậm hơn nên được dùng để mã hóa khóa phiên. Người nhận sau khi nhận được dữ liệu sẽ dùng khóa bí mật của mình để giải mã tìm ra khóa phiên, sau đó dùng khóa phiên này để giải mã dữ liệu gốc.

Cấu trúc tập tin của OpenPGP

Khuôn dạng tập tin (file) theo OpenPGP được dùng trong nhiều kiểu file, những thông báo được mã bằngOpenPGP bao gồm:

  • Những file có phần mở rộng (.pgp);
  • Những file chữ ký độc lập (.sig);
  • Những file chưa khóa truyền đi (.asc);
  • Những file chứa khóa công khai (.pkr) và khóa riêng (.skr).

 Dữ liệu trong một file được chia thành các gói, mỗi một gói bao gồm dữ liệu mà nó chứa và được thêm vào phần đầu một Header để xác định loại gói và độ dài của gói đó. Header mô tả kiểu và độ dài của gói khóa. Tất cả các gói đều bắt đầu bằng các Header. Header của gói cũ có độ dài là 1,2,3 hoặc 5 byte. Bit đầu tiên luôn có giá trị 1, bit thứ hai là 0 nếu là dạng cũ (old format). Đối với các gói mới, bit thứ 2 sẽ có giá trị 1, 6 bit còn lại của byte đầu tiên của header xác định kiểu gói. Header có thể có độ dài là 2,3,5 byte. Độ dài của gói tương ứng phụ thuộc vào giá trị của byte 2 của Header.

Các gói khóa trong OpenPGP

  • Gói khóa phiên được mã bằng khóa công cộng (Public key encrypted session key packet)
  • Gói khóa phiên được mã bằng khóa đối xứng (Symmetric key encrypted session key packet)
  • Gói chữ ký được dùng một lần (One pass signature packet)
  • Gói dữ liệu nén (Compressed data packet)
  • Gói dữ liệu dạng chữ (Literal data packet)
  • Gói định danh người dung (UserID packet)
  • Gói tin cậy (Trust packet)
  • Gói khóa công cộng (Public key packet)
  • Gói khóa bí mật
  • Gói khóa chữ ký

Một số thuật ngữ chính

  • KeyID là một giá trị 8 byte, nó được dùng để trợ giúp tìm kiếm các khóa. Không thể coi key ID là khác nhau đối với các khóa khác nhau. Người ta có thể làm tăng tốc độ tìm kiếm khóa bằng các kiểm tra key ID trước, sau đó mới kiểm tra trên fingerprintf. Khuôn dạng của phiên bản 3 dùng 8 byte thấp của n như là key ID, trong phiên bản 4 key ID là 8 byte thấp của fingerprint.
  • Fingerprintf là một chuỗi 16-20 byte duy nhất định danh của một khóa. Dùng để kiểm tra tính hiệu lực của khóa.
  • ASCII Armor: Quá trình thực hiện ASCII Armor gồm 2 bước. Đầu tiên dữ liệu được mã lại bằng cách dùng các ký hiệu hiển thị được. Sau đó các header sẽ được thêm một số thông tin để báo cho người dùng biết được dữ liệu mã OpenPGP đã dùng. Các dòng header có thể là:

----BEGIN PGP MESSAGE----

----BEGIN PGP PUBLIC KEY BLOCK----

----BEGIN PGP PRIVATE KEY BLOCK----

----BEGIN PGP MESSAGE,PART X/Y----

----BEGIN PGP MESSAGE,PART X----

----BEGIN PGP SIGNATURE----

Sau đó một dòng trống hoặc in ra giá trị các cặp khóa để gửi các thông tin đặc biệt khác. Hiện tại các định được các khóa sau:

          Version: số phiên bản OpenPGP

          Comment: những gì mà người gửi muốn nói

          MessageID: dùng để tìm tất cả các phần thông báo chia nhỏ. Mỗi chuỗi 32 ký tự có thể in được.

          Hash: một dấu chấm phân tách phần danh sách các thuật toán băm.

          Charset: ký tự dùng để xác định ký tự phi tiêu chuẩn (ví dụ tiếng Nhật, Hàn, Trung,..) đối với các thông điệp rõ.

Một số thuật toán trong OpenPGP

  • Mã khóa đối xứng: IDEA, 3DES, CAST
  • Các thuật toán khóa công khai: RSA, Elgâml, DSA
  • Hàm băm: MD5, SHA.

Quá trình mã hóa một thông điệp OpenPGP

PGP là giao thức để xác thực

Quá trình giải mã một thông điệp OpenPGP

PGP là giao thức để xác thực

Quá trình chữ ký số đối với người gửi

PGP là giao thức để xác thực

Ưu điểm và nhược điểm của OpenPGP

Nhờ sử dụng kết hợp mã hóa đối xứng và bất đối xứng, OpenPGP cho phép người dùng chia sẻ thông tin và khóa mật mã qua Internet một cách an toàn. Là một hệ thống kết hợp, OpenPGP vừa có tính bảo mật của mật mã bất đối xứng và tốc độ của mã hóa đối xứng. Ngoài bảo mật và tốc độ, tính năng chữ ký số đảm bảo tính toàn vẹn của dữ liệu và tính xác thực của người gửi.

Giao thức OpenPGP tạo ra một môi trường cạnh tranh được tiêu chuẩn hóa, và hiện nhiều công ty và tổ chức cung cấp các giải pháp OpenPGP. Tuy nhiên, tất cả các chương trình OpenPGP tuân thủ các tiêu chuẩn OpenPGP đều tương thích với nhau. Điều này có nghĩa là một chương trình có thể sử dụng các tệp và khóa tạo bởi một chương trình khác mà không có vấn đề gì.

Hệ thống OpenPGP có nhược điểm ở chỗ nó không dễ sử dụng và dễ hiểu, đặc biệt là đối với người dùng có ít kiến thức kỹ thuật. Ngoài ra, nhiều người cho rằng độ dài của các khóa công khai gây nhiều bất tiện.

Năm 2018, Electronic Frontier Foundation (EFF) đã xuất bản về một lỗ hổng lớn gọi là EFAIL. Lỗ hổng EFAIL cho phép kẻ tấn công khai thác nội dung HTML đang hoạt động trong các email được mã hóa để giành quyền truy cập vào các phiên bản văn bản gốc của thông điệp.

Tuy nhiên, cộng đồng OpenPGP đã biết về một số mối lo ngại được mô tả bởi EFAIL từ cuối những năm 1990 và trên thực tế, các lỗ hổng này được tạo ra từ các cách triển khai khác nhau từ phía máy khách email chứ không phải do OpenPGP. Vì vậy, mặc dù các tiêu đề gây lo lắng và hiểu lầm, OpenPGP vẫn không bị bẻ gãy và vẫn tiếp tục được xem là một phương thức bảo mật cao.

OpenPGP nằm trên Internet Standard Track và đang được phát triển tích cực. Nhiều ứng dụng khách email cung cấp bảo mật email tuân thủ OpenPGP như được mô tả trong RFC 3156. Đặc điểm kỹ thuật hiện tại là RFC 4880 (tháng 11 năm 2007), kế thừa của RFC 2440. RFC 4880 chỉ định một bộ thuật toán cần thiết bao gồm mã hóa ElGamal, DSA, Triple DES và SHA-1. Ngoài các thuật toán này, tiêu chuẩn khuyến nghị RSA như được mô tả trong PKCS # 1 v1.5 để mã hóa và ký, cũng như AES-128, CAST-128 và IDEA. Ngoài ra, nhiều thuật toán khác được hỗ trợ. Tiêu chuẩn đã được mở rộng để hỗ trợ mật mã Camellia bởi RFC 5581 vào năm 2009 và mã hóa dựa trên mật mã đường cong elip (ECDSA, ECDH) của RFC 6637 vào năm 2012. Hỗ trợ của EdDSA sẽ được thêm vào bởi dự thảo-koch-eddsa-for-openPGP-00 đề xuất vào năm 2014.

III. Ứng dụng

Một trong những ứng dụng phổ biến nhất của OpenPGP là bảo mật email. OpenPGP chuyển email mà nó bảo vệ thành một chuỗi các ký tự không thể đọc được (văn bản mã hóa) và chỉ có thể được giải mã nếu có khóa giải mã tương ứng. Trên thực tế, việc bảo mật các tin nhắn văn bản cũng sử dụng cơ chế tương tự, và cũng có một số ứng dụng phần mềm cho phép OpenPGP được triển khai bên trên các Ứng dụng khác, nghĩa là bổ sung thêm một hệ thống mã hóa vào các dịch vụ nhắn tin không bảo mật.

Mặc dù OpenPGP chủ yếu được sử dụng để bảo mật thông tin liên lạc trên mạng internet, nhưng nó cũng có thể được sử dụng để mã hóa các thiết bị riêng lẻ. Trong trường hợp này, OpenPGP có thể được sử dụng cho các phân vùng đĩa của máy tính hoặc thiết bị di động. Bằng cách mã hóa đĩa cứng, người dùng phải cung cấp mật khẩu mỗi khi hệ thống khởi động.

Facebook cho phép người dùng sử dụng chuẩn mã hóa OpenPGP nhằm bảo vệ email thông báo gửi bởi công ty, và chia sẻ khóa mã hóa công khai với bạn bè. Điều này giúp người dùng bảo vệ những tin nhắn riêng tư và nhạy cảm của người dùng trước tin tặc. Facebook cho biết họ đang dần dần triển khai một tính năng mới cho phép người dùng thêm khóa công khai OpenPGP vào hồ sơ của họ; khóa này có thể sử dụng để mã hóa email thông báo ‘end-to-end’ gửi từ Facebook đến tài khoản email đăng kí của bạn.

Kể từ khi được phát triển vào năm 1991, OpenPGP đã là một công cụ thiết yếu để bảo vệ dữ liệu và hiện được sử dụng trong nhiều ứng dụng khác nhau, cung cấp sự riêng tư, tính bảo mật và xác thực cho một số hệ thống truyền thông và nhà cung cấp dịch vụ kỹ thuật số. Mặc dù phát hiện năm 2018 về lỗ hổng EFAIL đã gây ra những lo ngại đáng kể về khả năng tồn tại của giao thức, công nghệ cốt lõi vẫn được coi là mạnh mẽ và hợp lý về mặt mật mã. Điều đáng chú ý là các cách triển khai OpenPGP khác nhau có thể mang đến các mức độ bảo mật khác nhau..

Trong Thông tư số 39/2017/TT-BTTTT ngày 15/12/2017 của Bộ trưởng Bộ Thông tin và Truyền thông Công bố Danh mục tiêu chuẩn kỹ thuật về ứng dụng công nghệ thông tin trong cơ quan nhà nước quy định Khuyến nghị áp dụng tiêu chuẩn Open PGP và được xếp vào nhóm Tiêu chuẩn về an toàn thông tin.

Tài liệu tham khảo

  1. https://tools.ietf.org/html/rfc4880
  2. https://www.openPGP.org/about/standard/

Nguyễn Thị Thu Trang