Mã hoá lớp ứng dụng

Các API thanh toán tiêu chuẩn hỗ trợ PGP hoặc JWE để mã hoá lớp ứng dụng.

Mã hoá PGP

PGP là một bộ tiêu chuẩn gồm các thuật toán mã hoá, giải mã và ký, cung cấp khả năng xác thực và quyền riêng tư về mật mã.

Khi sử dụng PGP để mã hoá tải trọng, đối tác phải hỗ trợ:

  • Mã hoá và giải mã tải trọng bằng nhiều khoá PGP.
  • Ký tải trọng bằng nhiều khoá PGP.
  • Xác minh tải trọng bằng nhiều chữ ký, trong đó có thể có chữ ký bằng khoá do Google cung cấp.
  • Giải mã tải trọng được mã hoá base64 an toàn cho web.

Khoá công khai PGP mà bạn cung cấp cho Google phải có một khoá phụ dùng để mã hoá. Khoá con cho phép xoay độc lập với khoá chính. Khoá chính được dùng để xác minh danh tính. Khoá riêng tư phải là khoá RSA 2048 bit (hoặc lớn hơn) hết hạn sau một năm với thời gian tồn tại tối đa là hai năm.

Trước khi bắt đầu phát triển, bạn cần trao đổi khoá PGP với Google. Trong bước này, bạn sẽ tạo một cặp khoá công khai-riêng tư PGP, cung cấp khoá công khai cho Google và nhận lại khoá công khai từ Google. Trong quá trình phát triển, bạn chỉ cần trao đổi các khoá hộp cát được dùng để phát triển và kiểm thử bên ngoài quy trình phát hành công khai. Trước khi kiểm thử và ra mắt công khai, bạn sẽ cần thực hiện một lần trao đổi khoá phát hành công khai khác.

Tạo khoá PGP mới

Giả sử bạn có một GPG binary (GPG nhị phân) trong đường dẫn hệ thống, bạn có thể dùng lệnh POSIX sau để tạo một cặp khoá mới.

$ gpg --full-generate-key

Khi được nhắc, hãy chọn một khoá RSA có ít nhất 2048 bit entropy và thời gian hết hạn là 1 đến 2 năm. Lệnh này sẽ tạo cả khoá chính (được gắn nhãn SC, cho việc tạo "S"ign và "C"ertificate) và khoá phụ (được gắn nhãn E, cho việc "E"ncryption).

Cấu hình thư viện PGP

Gửi tải trọng

  1. Khi ký, bạn nên sử dụng SHA384 làm thuật toán chuỗi đại diện; không sử dụng SHA1 hoặc MD5
  2. Khi mã hoá, bạn nên sử dụng AES256 làm thuật toán mã hoá đối xứng; không sử dụng CAST5 hoặc IDEA
  3. Khi mã hoá hoặc ký tin nhắn, hãy nhớ chọn khoá phụ có mục đích tương ứng; sử dụng khoá CAN_SIGN để ký và khoá ENCRYPT_COMMS/ENCRYPT_STORAGE để mã hoá

Nhận tải trọng

  1. Khi xác minh tải trọng, hãy đảm bảo thư viện của bạn hỗ trợ các thuật toán băm hiện đại như SHA384. Google sẽ bắt đầu sử dụng khoá này cho tất cả các khoá mới kể từ ngày 14 tháng 5 năm 2023.
  2. Khi giải mã tải trọng, hãy đảm bảo thư viện của bạn hỗ trợ các thuật toán mã hoá đối xứng hiện đại như AES256. Google sẽ bắt đầu sử dụng khoá này trên tất cả các khoá mới kể từ ngày 14 tháng 5 năm 2023.

Ví dụ về mã hoá tải trọng GPG

Lệnh sau đây là một ví dụ về cách chọn các lựa chọn bảo mật khi sử dụng GPG. Thao tác này dự kiến sẽ được thực hiện trong một môi trường đáng tin cậy, nơi mọi người không có quyền truy cập vào khoá riêng tư hoặc các tệp đầu vào nhạy cảm.

gpg --output signed-and-encrypted.pgp \
  --sign --digest-algo SHA384 \
  --encrypt --cipher-algo AES256 \
  --armor \
  --recipient {key_id} \
  input.txt

GPG sẽ tự động chọn khoá phù hợp từ gói cho mỗi thao tác mà bạn yêu cầu thực hiện.

Mã hoá JWE bằng chữ ký JWS

JSON Web Encryption (JWE) là một tiêu chuẩn do rfc7516 xác định để mã hoá nội dung ở cấp ứng dụng. Chữ ký web JSON (JWS) là một tiêu chuẩn do rfc7515 xác định để ký nội dung ở cấp ứng dụng.

Các yêu cầu và phản hồi sẽ là mã thông báo JWE được mã hoá bằng phương thức mã hoá bất đối xứng (khoá công khai) với lựa chọn "Compact Serialization" (Chuyển đổi tuần tự nhỏ gọn). Mã thông báo JWE sẽ chứa tải trọng đã ký dưới dạng mã thông báo JWS. JWS cũng sử dụng các khoá bất đối xứng; khoá riêng tư để ký và khoá công khai để xác minh.

Khi gửi tải trọng, trước tiên, hãy ký tải trọng rồi mã hoá tải trọng đó. Khi nhận tải trọng, trước tiên hãy giải mã tải trọng đó rồi xác minh chữ ký.

Khi sử dụng JWE, Đối tác phải hỗ trợ các lựa chọn sau:

  • Tuần tự hoá thu gọn.
  • Giải mã tải trọng từ một trong nhiều khoá JWE.
  • Thuật toán RSA-OAEP, RSA-OAEP-256 hoặc ECDH-ES để quản lý khoá.
  • Thuật toán A256GCM, A128GCM, A128CBC-HS256 hoặc A256CBC-HS512 để mã hoá nội dung.
    • Được điền sẵn trong tiêu đề enc.
  • tiêu đề kid để xác định khoá mã hoá công khai.
  • Tải trọng tin nhắn sử dụng phương thức mã hoá JWE phải sử dụng loại nội dung application/jose; charset=utf-8.

Khi sử dụng JWS, Đối tác phải hỗ trợ các lựa chọn sau:

  • Tuần tự hoá thu gọn.
  • Xác minh tải trọng từ một trong nhiều khoá JWS.
  • Thuật toán HS256, HS384, HS512, RS256, RS384, RS512, ES256, PS256, PS384 hoặc PS512 để tạo chữ ký.
  • Tiêu đề kid để xác định khoá ký riêng tư.

Các chuỗi JWE/JWS sẽ được mã hoá dưới dạng chuỗi UTF-8 và tải trọng của chúng có thể là các byte tuỳ ý.

Khoá riêng tư phải là khoá RSA/ECDH-ES hết hạn trong vòng một năm với thời gian tồn tại tối đa là hai năm. Tất cả danh tính khoá riêng tư phải luôn nằm trên máy chủ của đối tác và theo đó, tất cả các giá trị chữ ký phải được tính toán trên máy chủ của đối tác.

Trước khi bắt đầu phát triển, bạn cần trao đổi khoá JWE và JWS với Google. Các khoá phải được trao đổi ở định dạng JWK, như được xác định trong rfc7517. Trong bước này, bạn sẽ tạo một cặp khoá công khai-riêng tư, cung cấp khoá công khai cho Google và nhận lại khoá công khai từ Google. Trong quá trình phát triển, bạn chỉ cần trao đổi các khoá hộp cát được dùng để phát triển và kiểm thử bên ngoài quy trình phát hành công khai. Trước khi kiểm thử và ra mắt công khai, bạn sẽ cần thực hiện một lần trao đổi khoá phát hành công khai khác.