應用程式層加密

Client Side Push Provisioning API 支援以 PGP 或 JWE 執行應用程式層加密。

PGP 加密

PGP 是一組標準的加密、解密和簽署演算法,可提供加密編譯隱私保護與驗證功能。

使用 PGP 來加密酬載時,合作夥伴必須能夠執行下列作業:

  • 使用多組 PGP 金鑰來加密及解密酬載。
  • 使用多組 PGP 金鑰簽署酬載。
  • 使用多個簽名驗證酬載,其中任何一個簽名都可以是使用 Google 提供的金鑰進行的簽名。
  • 將採用 Base64 編碼的網路安全酬載解密。

提供給 Google 的 PGP 公開金鑰必須具有用於加密的子金鑰。子金鑰可與主要金鑰分開輪替。主要金鑰用於驗證身分。私密金鑰須為 2048 個位元以上的 RSA 金鑰,效期為一年,生命週期最長為兩年。

在開始開發之前,您必須先與 Google 交換 PGP 金鑰。在這個步驟中,您將產生 PGP 公開/私密金鑰組,將公開金鑰提供給 Google,並從 Google 收回公開金鑰。在開發期間,您只需要交換在非正式版環境中用於開發及測試的沙箱金鑰。在測試及發布正式版之前,您必須執行另一項正式版金鑰的交換作業。

產生新的 PGP 金鑰

假設系統路徑中存在 GPG 二進位檔,則可使用下列 POSIX 指令建立新的金鑰組。

$ gpg --full-generate-key

當系統提示時,選取熵長度至少為 2048 位元的 RSA 金鑰,並確認有效期限為 1 至 2 年。這個指令應會建立一組主要金鑰 (含有「SC」標籤,「S」代表簽署,「C」代表產生憑證) 和一組子金鑰 (含有「E」標籤,「E」代表加密)

PGP 程式庫設定

傳送酬載

  1. 簽署時應使用 SHA384 做為摘要演算法,請勿使用 SHA1MD5
  2. 加密時應使用 AES256 做為對稱加密演算法,請勿使用 CAST5IDEA
  3. 加密或簽署訊息時,請務必選取具有對應用途的子金鑰。請使用 CAN_SIGN 金鑰簽署,並使用 ENCRYPT_COMMS/ENCRYPT_STORAGE 金鑰加密

接收酬載

  1. 驗證酬載時,請確認程式庫支援 SHA384 等新型雜湊演算法。自 2023 年 5 月 14 日起,Google 會開始對所有新的金鑰中採用此演算法。
  2. 解密酬載時,請確認程式庫支援 AES256 等新型對稱加密演算法。自 2023 年 5 月 14 日起,Google 會開始對所有新的金鑰中採用此演算法。

GPG 酬載加密示例

以下示例說明如何在使用 GPG 時選取安全選項。這項作業應在安全可靠的環境中執行;在此環境中,使用者無法存取私密金鑰或敏感的輸入檔案。

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

GPG 會針對您要求執行的每項作業,自動從套件中選取正確的金鑰。

JWE 加密

JSON Web Encryption (JWE) 是由 rfc7516 定義的標準,可在應用程式層加密內容。

使用 JWE 來加密酬載時,合作夥伴必須能夠執行下列作業:

  • 透過其中一組 JWE 金鑰解密酬載。
  • 使用精簡序列化功能
  • 使用 JWE 壓縮功能 (即 zip="DEF")
  • 使用 RSA-OAEP/RSA-OAEP-256 或 ECDH-ES 演算法來管理金鑰
    • 不建議使用 RSAES-PKCS1-V1_5,但可以接受
  • 使用 A256GCM 演算法來加密內容

私密金鑰須為 RSA/ECDH-ES 金鑰,效期為一年,生命週期最長為兩年。所有私密金鑰 ID 一律須保存在合作夥伴的伺服器中,因此也必須在合作夥伴的伺服器中計算所有簽名值。

用戶端和伺服器會按照 JSON Web Encryption (JWE) 規格加密 JSON 主體。POST 或回應的整個主體即為 JWE 權杖,並會使用 JWE 的「精簡序列化」選項。

在開始開發之前,您必須先與 Google 交換 JWE 金鑰。在這個步驟中,您會產生公開/私密金鑰組,然後將公開金鑰提供給 Google,並從 Google 收回公開金鑰。在開發期間,您只需要交換在非正式版環境中用於開發及測試的沙箱金鑰。在測試及發布正式版之前,您必須執行另一項正式版金鑰的交換作業。

合作夥伴必須能夠使用 JWE 壓縮功能 (即 zip="DEF") 來收發訊息。要求和回應會採用非對稱式 (公開金鑰) 加密,這種加密機制會使用相互交換的 JWE 金鑰。另外,JWS 的簽名驗證程序同樣適用於 JWE,JWE 的內容會在加密前完成簽署,並在解密後經過驗證。JWS 也會使用非對稱式金鑰,私密金鑰用於簽署,公開金鑰則用於驗證。