Zum Inhalt springen

Ende-zu-Ende-Verschlüsselung

PushGo E2EE schützt sensible Geschäftsfelder. Der Absender verschlüsselt Felder in ciphertext, der Gateway leitet diesen Chiffretext weiter und Clients entschlüsseln lokal, nachdem ein Schlüssel konfiguriert wurde.

InhaltGeschützt durch E2EENotizen
Geschäftsfelder innerhalb ciphertextJaDer Gateway kann keinen Klartext lesen.
Einfache AnfragefelderNeinchannel_id, password, severity und Routen-IDs sind normale Anforderungsfelder.
HTTP-HeaderNeinGeschützt durch HTTPS/TLS, nicht durch E2EE.
LiefermetadatenNeinDer Gateway benötigt weiterhin grundlegende Metadaten für Authentifizierung, Routing und Versand.

E2EE ist kein Ersatz für die Gateway-Authentifizierung. Sie benötigen weiterhin Channel-Zugangsdaten, optionale Gateway Bearer-Token und HTTPS.

PushGo-Clients unterstützen AES-GCM. Die Schlüssellänge bestimmt die AES-Variante.

SchlüssellängeAlgorithmusNonce / IVAuth-Tag
16 ByteAES-128-GCM12 Byte16 Byte
24 ByteAES-192-GCM12 Byte16 Byte
32 ByteAES-256-GCM12 Byte16 Byte

Binäres Layout:

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

Codieren Sie den vollständigen Binärblob mit Base64 und platzieren Sie ihn im API ciphertext-Feld.

Nach der Entschlüsselung muss ciphertext ein JSON-Objekt enthalten. Clients erkennen die folgenden kanonischen Felder und schreiben sie zurück in die Benachrichtigungsnutzlast.

FeldGeben Sieein Verhalten
titlestringÜberschreibt den Benachrichtigungstitel.
bodystringÜberschreibt den Nachrichtentext.
urlstringÜberschreibt die Click-through-URL.
imagesstring[]- oder JSON-ZeichenfolgeÜberschreibt die Bildliste.
tagsstring[]- oder JSON-ZeichenfolgeÜberschreibt die Tag-Liste.
metadataobject- oder JSON-ZeichenfolgeÜberschreibt Metadaten.
FeldGeben Sieein Verhalten
descriptionstringÜberschreibt die Ereignisbeschreibung.
statusstringÜberschreibt den Ereignisstatus.
messagestringÜberschreibt die Ereignismeldung.
started_atnumberÜberschreibt die Startzeit des Ereignisses.
ended_atnumberÜberschreibt die Endzeit des Ereignisses.
attrsobject- oder JSON-ZeichenfolgeÜberschreibt den Patch für Ereignisattribute.
FeldGeben Sieein Verhalten
primary_imagestringÜberschreibt das primäre Bild.
statestringÜberschreibt den Entitätsstatus.
created_atnumberÜberschreibt die Erstellungszeit.
deleted_atnumberÜberschreibt die Löschzeit.
external_idsobject- oder JSON-ZeichenfolgeÜberschreibt externe IDs.
location_typestringÜberschreibt den Standorttyp.
location_valuestringÜberschreibt den Standortwert.
locationobject- oder JSON-ZeichenfolgeÜberschreibt das Standortobjekt.
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))

Das Beispiel key_hex ist ein 32-Byte-Schlüssel für AES-256-GCM. Verwenden Sie in der Produktion einen sicher generierten Zufallsschlüssel und konfigurieren Sie denselben Schlüssel lokal im Client.

Terminal-Fenster
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"
}'

Einfache title und body können als Ersatzanzeige für Clients ohne Schlüssel oder bei fehlgeschlagener Entschlüsselung dienen. Platzieren Sie wirklich sensible Inhalte im ciphertext.

StatusBedeutung
decryptOkDie Entschlüsselung war erfolgreich und mindestens ein Feld wurde angewendet.
decryptFailedGeheimtext ist vorhanden, aber die Entschlüsselung oder Analyse ist fehlgeschlagen.
notConfiguredFür den Client ist kein verwendbarer Schlüssel konfiguriert.
algMismatchDer konfigurierte Algorithmus passt nicht zur Nutzlast.
ProblemPrüfen
Entschlüsselung schlägt fehlGleicher Schlüssel, vollständiges Base64 und binäres Layout ciphertext + tag + nonce.
Der Client überschreibt keine FelderEntschlüsseltes JSON muss ein Objekt sein und Feldnamen müssen kanonisch sein.
Gateway kann den Titelimmer noch sehen Einfache Anforderungsfelder sind nicht E2EE-geschützt; Setzen Sie sensible Titel in ciphertext.
severity ist nicht verschlüsseltDies wird empfohlen, da die Gateway- und Plattform-Push-Dienste Prioritätsinformationen benötigen.