Ir al contenido

Cifrado de extremo a extremo

PushGo E2EE protege campos comerciales sensibles. El remitente cifra los campos en ciphertext, el Gateway transmite ese texto cifrado y los clientes lo descifran localmente después de configurar una clave.

ContenidoProtegido por E2EENotas
Campos de negocio dentro de ciphertextEl Gateway no puede leer texto sin formato.
Campos de petición simplesNochannel_id, password, severity y los ID de ruta son campos de petición normales.
Cabeceras HTTPNoProtegido por HTTPS/TLS, no por E2EE.
Metadatos de entregaNoEl Gateway todavía necesita metadatos básicos para autenticación, enrutamiento y envío.

E2EE no reemplaza la autenticación Gateway. Aún necesita credenciales de canal, tokens Gateway Bearer opcionales y HTTPS.

Los clientes PushGo admiten AES-GCM. La longitud de la clave determina la variante AES.

Longitud de claveAlgoritmoNonce / IVEtiqueta de autenticación
16 bytesAES-128-GCM12 bytes16 bytes
24 bytesAES-192-GCM12 bytes16 bytes
32 bytesAES-256-GCM12 bytes16 bytes

Diseño binario:

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

Codifique en Base64 el blob binario completo y colóquelo en el campo API ciphertext.

Después del descifrado, ciphertext debe contener un objeto JSON. Los clientes reconocen los siguientes campos canónicos y los vuelven a escribir en la carga útil de notificación.

CampoTipoComportamiento
titlestringAnula el título de la notificación.
bodystringAnula el cuerpo del mensaje.
urlstringAnula la URL de destino.
imagesCadena string[] o JSONAnula la lista de imágenes.
tagsCadena string[] o JSONAnula la lista de etiquetas.
metadataCadena object o JSONAnula los metadatos.
CampoTipoComportamiento
descriptionstringAnula la descripción del evento.
statusstringAnula el estado del evento.
messagestringAnula el mensaje de evento.
started_atnumberAnula la hora de inicio del evento.
ended_atnumberAnula la hora de finalización del evento.
attrsCadena object o JSONAnula el parche de atributos de eventos.
CampoTipoComportamiento
primary_imagestringAnula la imagen principal.
statestringAnula el estado de la entidad.
created_atnumberAnula el tiempo de creación.
deleted_atnumberAnula el tiempo de eliminación.
external_idsCadena object o JSONAnula los ID externos.
location_typestringAnula el tipo de ubicación.
location_valuestringAnula el valor de ubicación.
locationCadena object o JSONAnula el objeto de ubicación.

Los campos necesarios para la prioridad de enrutamiento y entrega, como channel_id, password, event_id, thing_id, event_time, observed_at y severity, normalmente deben permanecer en texto sin formato.

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))

El ejemplo key_hex es una clave de 32 bytes para AES-256-GCM. Utilice una clave aleatoria generada de forma segura en producción y configure la misma clave localmente en el cliente.

Ventana de terminal
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"
}'

Los title y body simples pueden ser una visualización alternativa para clientes sin una clave o cuando falla el descifrado. Coloque contenido verdaderamente confidencial dentro de ciphertext.

EstadoSignificado
decryptOkEl descifrado se realizó correctamente y se aplicó al menos un campo.
decryptFailedEl texto cifrado existe, pero no se pudo descifrar ni analizar.
notConfiguredEl cliente no tiene ninguna clave utilizable configurada.
algMismatchEl algoritmo configurado no coincide con la carga útil.
ProblemaConsultar
El descifrado fallaMisma clave, Base64 completo y diseño binario ciphertext + tag + nonce.
El cliente no anula los camposEl JSON descifrado debe ser un objeto y los nombres de los campos deben ser canónicos.
Gateway todavía puede ver el títuloLos campos de petición simples no están protegidos por E2EE; Poner títulos sensibles en ciphertext.
severity no está cifradoSe recomienda esto porque el Gateway y los servicios push de plataforma necesitan información prioritaria.