Kapitel 7 Sicherheit und Verschlüsselung
7.1 Sicherheitsmodell
Eine DTP-Implementierung MUST Ende-zu-Ende-Verschlüsselung bereitstellen. Das Sicherheitsmodell MUST die folgenden Invarianten erfüllen:
- Nur die Ziel-iFay-Instanz MUST die empfangene Payload entschlüsseln können.
- Die FayGer-Laufzeitumgebung MUST NOT unter keinen Umständen auf Klartextdaten zugreifen.
- Zwischennetzwerk-Knoten MUST NOT den Klartext der Payload lesen.
- Die DTP-Implementierung MUST NOT Verschlüsselungsschlüssel selbst verwalten.
7.2 Verschlüsselungsumfang
Der Verschlüsselungsumfang MUST strikt auf die Payload des LogicalFrame beschränkt sein.
7.2.1 Inhalte, die verschlüsselt werden MUST
Die folgenden Daten MUST verschlüsselt werden:
- Das Feld
payloaddes LogicalFrame (d.h. das Felddataeines Fragments und—wenn als Frame transportiert—die Inhalte von RequestFrame, ResponseFrame und ControlFrame).
7.2.2 Inhalte, die NICHT verschlüsselt werden DÜRFEN
Die folgenden Daten MUST NOT verschlüsselt werden und MUST im Klartext übertragen werden:
- Der
headerdes LogicalFrame (einschließlichprotocolVersion,frameType,fragmentId,agreementId,originTimestamp,dagDependencies,encryptionMetadataundsequenceNumber).
Die Verschlüsselungs-Metadaten selbst MUST NOT verschlüsselt werden, damit der Empfänger die Entschlüsselungsparameter vor der Entschlüsselung bestimmen kann.
7.3 Schlüsselverwaltung
7.3.1 Schlüsselquelle
Eine DTP-Implementierung MUST den von CAP vorab ausgehandelten Schlüssel verwenden. Konkret:
- CAP MUST während der Verbindungsaufbauphase die Identitätsauthentifizierung und den Schlüsselaustausch abschließen.
- Die DTP-Implementierung MUST den von CAP bereitgestellten
sessionKeyfür die Payload-Verschlüsselung/-Entschlüsselung verwenden. - Die DTP-Implementierung MUST NOT Verschlüsselungsschlüssel selbst generieren, aushandeln oder austauschen.
7.3.2 CAPContext-Schnittstelle
Eine DTP-Implementierung MUST den von CAP bereitgestellten Kontext über die folgende Schnittstelle empfangen:
interface CAPContext {
identity: string;
sessionKey: Uint8Array;
verified: boolean;
}
| Feld | Normative Anforderung |
|---|---|
identity | MUST der Identitätsbezeichner des Gegenübers sein |
sessionKey | MUST die Bytefolge des durch CAP ausgehandelten Sitzungsschlüssels sein |
verified | MUST den CAP-Verifizierungsstatus widerspiegeln |
7.3.3 CAP-Vorbedingungen
Eine DTP-Implementierung MUST den CAPContext vor Beginn der Datenübertragung verifizieren:
- Wenn
verified === false, MUST das Senden jeglicher Daten-Frames verweigert werden und der FehlerKEY_NOT_READY(2002) zurückgegeben werden. - Wenn
sessionKeyleer ist oder eine ungültige Länge hat, MUST der FehlerKEY_NOT_READYzurückgegeben werden. - Die Übertragung von Verhandlungs-Frames (Request_Frame, Response_Frame) unterliegt gleichermaßen dieser Vorbedingung.
7.4 Verschlüsselungs-Metadaten
Der Frame-Header jedes LogicalFrame MUST EncryptionMetadata tragen:
interface EncryptionMetadata {
algorithm: string;
keyVersion: number;
}
7.4.1 Algorithmusbezeichner
Das Feld algorithm MUST der Bezeichner-String des Verschlüsselungsalgorithmus sein. SHOULD einen der folgenden standardisierten Namen verwenden:
| Bezeichner | Algorithmus | Status |
|---|---|---|
"AES-256-GCM" | AES-256 im Galois/Counter Mode | RECOMMENDED |
"ChaCha20-Poly1305" | ChaCha20 mit Poly1305 | RECOMMENDED |
"AES-128-GCM" | AES-128 im Galois/Counter Mode | MAY verwendet werden |
Eine Implementierung MUST mindestens einen von AES-256-GCM und ChaCha20-Poly1305 unterstützen. Es ist RECOMMENDED, beide für verbesserte Interoperabilität zu unterstützen.
Eine Implementierung MUST NOT Folgendes verwenden:
- ECB-Modus (unsicher)
- Nicht-authentifizierte Verschlüsselungsmodi (CBC, CTR ohne MAC)
- Algorithmen mit bekannten Schwachstellen (DES, 3DES, RC4)
7.4.2 Schlüsselversionsnummer
keyVersion MUST eine nicht-negative Ganzzahl sein, die zur Unterstützung der Schlüsselrotation verwendet wird:
- Wenn CAP eine Schlüsselrotation auslöst, MUST die
keyVersiondes neuen Schlüssels strikt größer als die vorherige Version sein. - Der Empfänger MUST den entsprechenden Entschlüsselungsschlüssel basierend auf
keyVersionauswählen. - Eine Implementierung SHOULD mindestens eine vorherige Schlüsselversion vorhalten, um in-flight-Fragments zu unterstützen.
7.5 Roundtrip-Konsistenz der Verschlüsselung
Eine Implementierung MUST die folgenden Eigenschaften der Verschlüsselungs-Roundtrip-Konsistenz erfüllen:
- Verschlüsseln und anschließendes Entschlüsseln mit dem korrekten Schlüssel (passend zum vom Sender verwendeten Schlüssel) MUST eine Ausgabe ergeben, die byteweise identisch zur ursprünglichen Payload ist.
- Entschlüsseln mit einem falschen Schlüssel MUST fehlschlagen und MUST den Fehler
DECRYPTION_FAILED(2001) zurückgeben. - Bei Entschlüsselungsfehler MUST NOT die Implementierung partielle Entschlüsselungsergebnisse oder beschädigte Daten zurückgeben.
7.6 Entschlüsselung auf der Endgeräteseite
Wenn das Endgerät als Empfänger fungiert (Dateneinspeisungs-Szenario):
- Der DTP_Slave MUST den vom Endgerät während der CAP-Verbindungsaufbauphase übermittelten Schlüssel zur Entschlüsselung verwenden.
- Dieser Schlüssel MUST dem privaten Schlüssel/Sitzungsschlüssel entsprechen, den das Endgerät in CAP übermittelt hat.
- Das Endgerät MUST NOT das Entschlüsselungsergebnis irgendeines anderen Schlüssels akzeptieren.
7.7 Behandlung von Entschlüsselungsfehlern
Eine Implementierung MUST Entschlüsselungsfehler nach den folgenden Regeln behandeln:
- Einzelner Entschlüsselungsfehler: Frame verwerfen und die Fehlerbenachrichtigung
DECRYPTION_FAILED(2001) senden. - Aufeinanderfolgende Entschlüsselungsfehler, die einen Schwellenwert überschreiten (implementierungsdefiniert, RECOMMENDED 3): a. SHOULD CAP zur Neuverhandlung der Schlüssel auslösen. b. SHOULD die Anwendung der oberen Schicht über eine Sicherheitsanomalie benachrichtigen.
- Die Implementierung MUST NOT denselben Frame nach mehreren Entschlüsselungsfehlern unbegrenzt wiederholen.
7.8 Minderung von Sicherheitsbedrohungen
Eine Implementierung MUST die folgenden Bedrohungen durch Protokolldesign mindern:
| Bedrohung | Minderungsmechanismus |
|---|---|
| Man-in-the-Middle-Abhören | Ende-zu-Ende-Verschlüsselung der Payload |
| FayGer-Schnüffeln | Payload-Verschlüsselung; FayGer kann nur Geheimtext sehen |
| Schlüsselleck | Schlüsselversionsmechanismus unterstützt Schlüsselrotation |
| Identitätsfälschung | Delegiert an CAP zur Verifizierung |
| Replay-Angriffe | Monoton steigende Sequenznummern + Session-Bindung |
| Frame-Manipulation | Authentifizierte Verschlüsselungs-(AEAD-)Algorithmen |
7.9 Replay-Schutz
Eine Implementierung MUST Replay-Angriffe durch die folgenden Mechanismen mindern:
- Monoton steigende Sequenznummern: Der Empfänger MUST Frames ablehnen, deren Sequenznummer kleiner oder gleich der höchsten bestätigten Sequenznummer ist (außer in Wiederaufnahme-Szenarien).
- Session-Bindung: Der Sequenznummernraum MUST an eine bestimmte Session gebunden sein. Eine neue Session MUST die Sequenznummer zurücksetzen.
- AEAD-Authentifizierung: Der Verschlüsselungsalgorithmus MUST Nachrichtenauthentifizierung bereitstellen (GCM, Poly1305 usw.).
7.10 Metadaten-Privatsphäre
Eine Implementierung SHOULD sich bewusst sein, dass die Klartext-Metadaten im Frame-Header die folgenden Informationen offenlegen MAY:
- Identitäten der Kommunikationspartner (über
agreementIdkorreliert) - Kommunikationszeitmuster (über
originTimestampundsequenceNumber) - Datenübertragungsfrequenz (über Inter-Frame-Timing)
Eine Implementierung MAY die Metadaten-Privatsphäre verbessern durch:
- Aktivieren von Verkehrs-Padding (implementierungsdefiniert).
- Verwendung einer Verschleierungs-Transportschicht (z.B. ECH basierend auf TLS 1.3).
Diese Spezifikation REQUIRES jedoch NOT, dass eine Implementierung Metadaten-Privatsphärenschutz bereitstellt.
