應用程式層加密

Standard Payments 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 加密和 JWS 簽署功能

JSON Web Encryption (JWE) 是由 rfc7516 定義的標準,可在應用程式層加密內容。JSON Web Signature (JWS) 則是由 rfc7515 定義的標準,可在應用程式層級簽署內容。

要求和回應是以非對稱式 (公開金鑰) 加密搭配「精簡序列化」選項的 JWE 權杖加密。JWE 權杖會包含已簽署的酬載,做為 JWS 權杖。JWS 也會使用非對稱式金鑰,私密金鑰用於簽署,公開金鑰則用於驗證。

傳送酬載時,請先簽署酬載,然後再加密。接收酬載時,請先將其解密,再驗證簽章。

使用 JWE 時,合作夥伴必須能執行下列作業:

  • 使用精簡序列化功能。
  • 透過其中一組 JWE 金鑰解密酬載。
  • 使用 RSA-OAEP、RSA-OAEP-256 或 ECDH-ES 演算法管理金鑰。
  • A256GCMA128GCMA128CBC-HS256A256CBC-HS512 演算法,適用於內容加密。
    • 填入 enc 標頭中。
  • kid 標頭用於識別公開加密金鑰。
  • 採用 JWE 加密的訊息酬載必須使用 application/jose; charset=utf-8 內容類型。

使用 JWS 時,合作夥伴必須能執行下列作業:

  • 使用精簡序列化功能。
  • 透過其中一組 JWS 金鑰驗證酬載。
  • 建立簽名時使用的 HS256、HS384、HS512、RS256、RS384、RS512、ES256、PS256、PS384 或 PS512 演算法。
  • kid 標頭用於識別私密簽署金鑰。

JWE/JWS 字串將編碼為 UTF-8 字串,且其酬載可以是任意位元組。

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

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