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

API Payments thông thường hỗ trợ PGP hoặc JWE để mã hoá lớp ứng dụng.

Mã hoá PGP

PGP là một bộ thuật toán mã hoá, giải mã và ký tiêu chuẩn cung cấp tính năng xác thực và bảo vệ quyền riêng tư bằng 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ã các tải trọng bằng nhiều khoá PGP.
  • Ký các gói dữ liệu bằng nhiều khoá PGP.
  • Xác minh một tải trọng có nhiều chữ ký, bất kỳ chữ ký nào trong số đó cũng có thể là chữ ký bằng khoá do Google cung cấp.
  • Giải mã các tải trọng được mã hoá base64 an toàn trên web.

Khoá công khai PGP cung cấp cho Google phải có một khoá con 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 (trở lên) bit hết hạn sau một năm với thời gian hoạt động 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. Ở bước này, bạn sẽ tạo một cặp khoá riêng tư công khai 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 dùng cho hoạt động phát triển và kiểm thử bên ngoài môi trường phát hành chính thức. Trước khi kiểm thử và khởi chạy phiên bản chính thức, bạn sẽ cần trao đổi lại khoá sản xuất.

Tạo khoá PGP mới

Giả sử có một tệp nhị phân GPG trong đường dẫn hệ thống, bạn có thể dùng lệnh POSIX sau đây để 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 hạn là 1 đến 2 năm. Lệnh này sẽ tạo cả một khoá chính (có nhãn SC, cho "S'igning và "C'ertificate created) và một khoá con (có nhãn E, cho "E'ncryification).

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

Gửi gói dữ liệu

  1. Khi ký, bạn nên dùng SHA384 làm thuật toán tổng hợp; không 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ý thông báo, hãy nhớ chọn khoá phụ phù hợp với mục đích tương ứng; sử dụng khoá CAN_SIGN để ký và khoá ENCRYPT_COMMS/ENCRYPT_STORAGE để mã hoá

Nhận gói dữ liệu

  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 trên 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 rằng thư viện của bạn hỗ trợ các thuật toán mã hoá đối xứng hiện đại, chẳng hạn như AES256. Google sẽ bắt đầu sử dụng khoá này trên tất cả khoá mới kể từ ngày 14 tháng 5 năm 2023.

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

Lệnh bên dưới là ví dụ về cách chọn các chế độ bảo mật khi sử dụng GPG. Thao tác này dự kiến đượ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 tệp nhập 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 trong 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

Mã hoá web JSON (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ẽ được mã hoá JWE bằng phương thức mã hoá bất đối xứng (khoá công khai) với tuỳ 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 khoá bất đối xứng; khoá riêng tư để ký và khoá công khai để xác minh.

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

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

  • Chuyển đổi tuần tự nhỏ gọn.
  • Giải mã các 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 phục vụ việc 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.
  • Các gói dữ liệu thông báo sử dụng chế độ mã hoá JWE phải sử dụng loại nội dung ứng dụng/jose; character=utf-8.

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

  • Chuyển đổi tuần tự nhỏ gọn.
  • Xác minh các tải trọng qua 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 các chuỗi này có thể là các byte tuỳ ý.

Khoá riêng tư phải là khoá RSA/ECDH-ES sẽ hết hạn sau 1 năm với thời gian hoạt động tối đa là 2 năm. Tất cả thông tin nhận dạng 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. Bạn phải trao đổi khoá ở định dạng JWK, như định nghĩa trong rfc7517. Ở 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 dùng cho hoạt động phát triển và kiểm thử bên ngoài môi trường phát hành chính thức. Trước khi kiểm thử và khởi chạy phiên bản chính thức, bạn sẽ cần trao đổi lại khoá sản xuất.