콘텐츠로 이동

종단 간 암호화

PushGo E2EE는 민감한 비즈니스 분야를 보호합니다. 발신자는 필드를 ciphertext로 암호화하고, Gateway는 해당 암호문을 중계하며, 클라이언트는 키가 구성된 후 로컬로 암호를 해독합니다.

내용E2EE로 보호됨참고
ciphertext 내부 사업 분야Gateway는 일반 텍스트를 읽을 수 없습니다.
일반 요청 필드아니요channel_id, password, severity 및 경로 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 상태를 재정의합니다.
messagestringEvent Message를 재정의합니다.
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"
}'

일반 titlebody는 키가 없거나 암호 해독에 실패한 클라이언트에 대한 대체 표시가 될 수 있습니다. ciphertext 안에 정말 민감한 콘텐츠를 담으세요.

상태의미
decryptOk암호 해독에 성공했으며 하나 이상의 필드가 적용되었습니다.
decryptFailed암호문이 존재하지만 암호 해독 또는 구문 분석에 실패했습니다.
notConfigured클라이언트에 구성된 사용 가능한 키가 없습니다.
algMismatch구성된 알고리즘이 페이로드와 일치하지 않습니다.
문제확인
암호 해독 실패동일한 키, 완전한 Base64 및 바이너리 레이아웃 ciphertext + tag + nonce.
클라이언트는 필드를 재정의하지 않습니다복호화된 JSON는 객체여야 하며 필드 이름은 표준이어야 합니다.
Gateway는 여전히 제목을 볼 수 있습니다일반 요청 필드는 E2EE로 보호되지 않습니다. ciphertext에 민감한 제목을 넣으세요.
severity는 암호화되지 않습니다Gateway 및 플랫폼 푸시 서비스에는 우선순위 정보가 필요하기 때문에 권장됩니다.