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 程式庫設定
傳送酬載
- 簽署時應使用
SHA384
做為摘要演算法,請勿使用SHA1
或MD5
- 加密時應使用
AES256
做為對稱加密演算法,請勿使用CAST5
或IDEA
- 加密或簽署訊息時,請務必選取具有對應用途的子金鑰。請使用
CAN_SIGN
金鑰簽署,並使用ENCRYPT_COMMS
/ENCRYPT_STORAGE
金鑰加密
接收酬載
- 驗證酬載時,請確認程式庫支援
SHA384
等新型雜湊演算法。自 2023 年 5 月 14 日起,Google 會開始對所有新的金鑰中採用此演算法。 - 解密酬載時,請確認程式庫支援
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 也會使用非對稱式金鑰,私密金鑰用於簽署,公開金鑰則用於驗證。