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 加密和 JWS 簽署功能
JSON Web Encryption (JWE) 是由 rfc7516 定義的標準,可在應用程式層加密內容。JSON Web Signature (JWS) 則是由 rfc7515 定義的標準,可在應用程式層級簽署內容。
要求和回應會是 JWE 權杖,採用非對稱式 (公開金鑰) 加密,並使用「精簡序列化」選項。JWE 權杖會以 JWS 權杖的形式包含已簽署的酬載。JWS 也會使用非對稱式金鑰,私密金鑰用於簽署,公開金鑰則用於驗證。
傳送酬載時,請先簽署酬載,再加密。收到酬載時,請先解密,再驗證簽章。
使用 JWE 時,合作夥伴必須支援下列選項:
- 使用精簡序列化功能。
- 透過其中一組 JWE 金鑰解密酬載。
- 使用 RSA-OAEP、RSA-OAEP-256 或 ECDH-ES 演算法管理金鑰。
- 填入
alg
標頭 (rfc7518 第 4.1 節)。
- 填入
- 使用 A256GCM、A128GCM、A128CBC-HS256 或 A256CBC-HS512 演算法加密內容。
- 填入
enc
標頭。
- 填入
kid
標頭,用於識別公開加密金鑰。- 採用 JWE 加密的訊息酬載必須使用 application/jose; charset=utf-8 內容類型。
使用 JWS 時,合作夥伴必須支援下列選項:
- 使用精簡序列化功能。
- 透過其中一組 JWS 金鑰驗證酬載。
- 使用 HS256、HS384、HS512、RS256、RS384、RS512、ES256、PS256、PS384 或 PS512 演算法建立簽名。
- 填入
alg
標頭 (rfc 7518 節 3.1)。
- 填入
kid
標頭,用於識別私密簽署金鑰。
JWE/JWS 字串會編碼為 UTF-8 字串,且其酬載可能為任意位元組。
私密金鑰須為 RSA/ECDH-ES 金鑰,效期為一年,生命週期最長為兩年。所有私密金鑰 ID 一律須保存在合作夥伴的伺服器中,因此也必須在當中計算所有簽名值。
在開始開發前,請務必先與 Google 交換 JWE 和 JWS 金鑰。交換金鑰時,應使用 rfc7517 中定義的 JWK 格式。在這個步驟中,您會產生公開/私密金鑰組,將公開金鑰提供給 Google,並從 Google 收回公開金鑰。在開發期間,您只需要交換在非正式版環境中用於開發及測試的沙箱金鑰。在測試及發布正式版前,您必須執行另一項正式版金鑰的交換作業。