コンテンツにスキップ

エンドツーエンドの暗号化

PushGo E2EE は機密性の高いビジネス分野を保護します。送信者はフィールドを ciphertext に暗号化し、Gateway がその暗号文を中継し、クライアントはキーの設定後にローカルで復号化します。

コンテンツE2EEによって保護されていますメモ
ciphertext内の事業分野はいGateway は平文を読み取ることができません。
プレーンなリクエストフィールドいいえchannel_idpasswordseverity、およびルート ID は通常のリクエスト フィールドです。
HTTP ヘッダーいいえE2EE ではなく、HTTPS/TLS によって保護されます。
配信メタデータいいえGateway には、認証、ルーティング、ディスパッチのための基本的なメタデータが依然として必要です。

E2EE は、Gateway 認証に代わるものではありません。チャネル資格情報、オプションの Gateway Bearer トークン、および HTTPS が引き続き必要です。

PushGo クライアントは AES-GCM をサポートします。キーの長さによって AES バリアントが決まります。

キーの長さアルゴリズムノンス / IV認証タグ
16バイトAES-128-GCM12バイト16バイト
24バイトAES-192-GCM12バイト16バイト
32バイトAES-256-GCM12バイト16バイト

バイナリレイアウト:

[ ciphertext (N bytes) ][ auth tag (16 bytes) ][ nonce / iv (12 bytes) ]

完全なバイナリ BLOB を Base64 でエンコードし、API ciphertext フィールドに配置します。

復号化後、ciphertext には JSON オブジェクトが含まれている必要があります。クライアントは次の正規フィールドを認識し、それらを通知ペイロードに書き戻します。

フィールドタイプ行動
titlestring通知のタイトルを上書きします。
bodystringMessage本文をオーバーライドします。
urlstringリンク先 URL をオーバーライドします。
imagesstring[] または JSON 文字列画像リストをオーバーライドします。
tagsstring[] または JSON 文字列タグリストをオーバーライドします。
metadataobject または JSON 文字列メタデータをオーバーライドします。
フィールドタイプ行動
descriptionstringEventの説明をオーバーライドします。
statusstringEventステータスをオーバーライドします。
messagestringEventMessageをオーバーライドします。
started_atnumberEventの開始時間をオーバーライドします。
ended_atnumberEventの終了時刻をオーバーライドします。
attrsobject または JSON 文字列Event属性パッチをオーバーライドします。
フィールドタイプ行動
primary_imagestringプライマリ イメージをオーバーライドします。
statestringエンティティの状態をオーバーライドします。
created_atnumber作成時間をオーバーライドします。
deleted_atnumber削除時刻をオーバーライドします。
external_idsobject または JSON 文字列外部 ID をオーバーライドします。
location_typestring場所のタイプをオーバーライドします。
location_valuestring位置の値をオーバーライドします。
locationobject または JSON 文字列位置オブジェクトをオーバーライドします。
import base64
import json
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
def encrypt_payload(key_hex, payload):
key = bytes.fromhex(key_hex)
aesgcm = AESGCM(key)
nonce = os.urandom(12)
plaintext = json.dumps(payload, separators=(",", ":")).encode("utf-8")
cipher_and_tag = aesgcm.encrypt(nonce, plaintext, None)
return base64.b64encode(cipher_and_tag + nonce).decode("utf-8")
payload = {
"title": "Database lag",
"body": "Replica lag exceeded 60 seconds.",
"tags": ["encrypted", "database"],
"metadata": {"source": "replica-monitor"}
}
key_hex = "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff"
print(encrypt_payload(key_hex, payload))

例の key_hex は、AES-256-GCM の 32 バイトのキーです。本番環境では安全に生成されたランダム キーを使用し、同じキーをクライアントでローカルに構成します。

Terminal window
curl -X POST https://gateway.pushgo.dev/message \
-H "Content-Type: application/json" \
-d '{
"channel_id": "YOUR_CHANNEL_ID",
"password": "YOUR_CHANNEL_PASSWORD",
"title": "Encrypted message",
"body": "Your client will try to decrypt ciphertext.",
"severity": "normal",
"ciphertext": "BASE64_ENCODED_CIPHERTEXT"
}'

プレーン title および body は、キーのないクライアントまたは復号化が失敗した場合のフォールバック表示として使用できます。本当に機密性の高いコンテンツを ciphertext 内に置きます。

状態意味
decryptOk復号化が成功し、少なくとも 1 つのフィールドが適用されました。
decryptFailed暗号文は存在しますが、復号化または解析に失敗しました。
notConfiguredクライアントには使用可能なキーが構成されていません。
algMismatch構成されたアルゴリズムがペイロードと一致しません。
問題チェック
復号化に失敗します同じキー、完全な Base64、バイナリ レイアウト ciphertext + tag + nonce
クライアントがフィールドを上書きしない復号後の JSON はオブジェクトである必要があり、フィールド名は正規のものにしてください。
Gateway ではまだタイトルが表示されますプレーン リクエスト フィールドは E2EE で保護されていません。機密性の高いタイトルは ciphertext に入れてください。
severity は暗号化されていませんGateway およびプラットフォーム プッシュ サービスには優先度情報が必要であるため、これをお勧めします。