2 Web of Trust
Wir definieren das Web of Trust als eine Menge von gemeinsamen VaultysId. Jeder Besitzer einer VaultysId hat seine eigene Menge von VaultysId, um zu kommunizieren. Die in den VaultysId enthaltenen Schlüssel können verwendet werden, um Daten zu signieren oder zu verschlüsseln. Jeder Dienst kann sein eigenes Protokoll verwenden, um Schlüssel daraus abzuleiten.
Es ist jedoch ein Protokoll für das Vertrauenssetup definiert, um die Menge der verlässlichen Schlüssel zu integrieren. Das Protokoll wird als Symetric Relationship Protocol (SRP) bezeichnet, da es darauf abzielt, ein von beiden Parteien signiertes Zertifikat zu erstellen, das auf beiden Seiten gleich ist.
2.1 Symetric Relationship Protocol
Zwischen Bob und Alice, die jeweils eine VaultysId haben. Die ausgetauschten Daten sind:
Protokoll
Name (zum Beispielp2p
)Dienst
Name (zum Beispielauth
)Zeitstempel
, der zur Verhinderung von Replay-Angriffen verwendet wirdid1
undid2
sind die VaultysId von Bob und Alice respektive.Nonce
(zufällig)sign1
undsign2
sind Signaturen, die vom Signierschlüssel vonId1
undId2
erstellt wurdenmetadata1
undmetadata2
sind JSON-Objekte, die leer sein können Wir können das Protokoll mit dem Schema zusammenfassen:Nachricht = { Protokoll, Dienst, Zeitstempel, id1, id2, nonce1, nonce2, metadata1, metadata2 }
sign1
undsign2
sind Signaturen unter Verwendung der Signierschlüssel vonid1
undid2
vonsha256(messagepack(message))
Metadaten werden vom Protokoll
und Dienst
benutzerdefiniert. Zum Beispiel können wir Metadaten verwenden, um Namen, E-Mail und Telefon zwischen den Parteien auszutauschen, damit sie innerhalb des Web of Trust des anderen zertifiziert sind.
Wir definieren:
- M1 =
Protokoll, Dienst, Zeitstempel, id1, nonce1, metadata1
- M2 =
id2, nonce2, metadata2
- sign1 und sign2 sind Signaturen von
sha256(M1 | M2)
Zertifikat
=sha256(M1 | M2) | sign1 | sign2
ZertifikatsId
=sha256(Zertifikat)
- Nachrichten werden mittels MessagePack serialisiert
Das Protokoll muss auf folgende Infrastruktur vertrauen:
- Eine bidirektionale Kommunikation
Kanal
, die Bob und Alice bereits bekannt ist. Aktive Angriffe sind erlaubt, außer beim anfänglichen Handshake (siehe später) - Ein
Speicher
, der in der Lage ist, Id und Zertifikat zu speichern. Das Sicherheitsmodell für denSpeicher
ist ein passiver Angriff (d. h. in der Lage, die Daten zu lesen, aber nicht zu manipulieren).
2.2 Allgemeine Beschreibung
- Bob -> Alice: sendet M1
- Alice überprüft, ob dies die Absicht in
Protokoll, Dienst, metadata1
ist, die sie verwenden möchte, und ob die Daten kohärent sind. - Alice überprüft, ob der Zeitstempel innerhalb einer angemessenen Zeit liegt (festgelegt durch das
Protokoll
) - Alice -> Bob: sendet M1 + M2 + sign2
- Bob überprüft, ob
metadata2, sign2
kohärent sind - Bob -> Alice:
sign1
- Alice überprüft, ob
sign1
gültig ist - Alice -> Bob:
VOLLSTÄNDIG
, um das Ende der Kommunikation zu bestätigen - Alice und Bob speichern die Ids zusammen mit dem
Zertifikat
, das für Alice und Bob gleich ist
In einer zukünftigen Version des Protokolls könnte VOLLSTÄNDIG
durch die ZertifikatsId
ersetzt werden, wenn sie definiert ist.
2.3 Initialer Handshake
Der initiale Handshake ist eine Möglichkeit, unbekannte Schlüssel zwischen den Parteien auszutauschen. Der aktive Angriff, bei dem ein Angreifer Daten während des Protokolls ändern kann, fällt nicht in den Geltungsbereich des Sicherheitsmodells. Das obligatorische Setup für die Sicherheit:
- persönliche Durchführung des Protokolls.
- sicherer p2p-Kanal:
- mit einem vorübergehenden zufälligen Schlüssel, der ausgetauscht wird (zum Beispiel über QR-Code), der verwendet wird, um die im Protokoll ausgetauschten Daten zu verschlüsseln
- Keine Vorwärtsgeheimhaltung erforderlich
- Der Schlüssel wird danach zerstört. Das Protokoll ist gegen spätere Wiederherstellung oder passive Angriffe resistent. Die Konstanten sind definiert:
Protokoll
=p2p
Dienst
=auth
- Zeitstempelabweichung beträgt 10s
metadata1
undmetadata2
sind leer.
Im Falle eines nicht persönlichen Handshakes kann der Zeitstempel auf ein paar Stunden (typischerweise 2 Stunden) gelockert werden, aber es wird daran erinnert, dass das Sicherheitsmodell darauf besteht, dass der Kommunikationskanal zur Übermittlung von Informationen oder Endpunkt (E-Mail, Chat, SMS) während des Handshakes NICHT kompromittiert ist.
2.4 Authentifizierung
Nach Abschluss des Handshake-Protokolls ist es jederzeit möglich, sich gegenseitig zu authentifizieren. Zum Beispiel ersetzen wir ein klassisches Anmeldesystem basierend auf Benutzername/Passwort/mfa
durch dieses einzelne Authentifizierungsschema:
Protokoll
=p2p
Dienst
=auth
- Zeitstempelabweichung beträgt 10s
metadata1
undmetadata2
sind leer.
Die Überprüfung auf beiden Seiten, Alice
und Bob
, hat einen zusätzlichen Schritt, nämlich die Überprüfung der Gültigkeit des Handshake-Registrierungszertifikats auf beiden Seiten:
2.5 Referenzimplementierung
-
Die Serialisierung von MessagePack wird von https://github.com/ygoe/msgpack.js/tree/v1.0.3 durchgeführt
-
Die für Ed25519 verwendete Kryptographie wird von https://github.com/StricaHQ/bip32ed25519/tree/v1.0.4 behandelt
-
Die COSE-Deserialisierung für die FIDO2-Brückenimplementierung wird von https://github.com/hildjj/node-cbor/tree/v8.0.1 behandelt
-
Die X509-Zertifikatsdeserialisierung für die FIDO2-Brückenimplementierung wird von https://github.com/PeculiarVentures/x509/tree/v1.9.2 behandelt
-
Zufalls- und sha256-Primitive sind die von Nodejs bereitgestellten:
createHash
randomBytes
- für den Browser delegiert an https://github.com/browserify/crypto-browserify/tree/v3.12.0
- https://github.com/browserify/randombytes (verwendet getRandomValues-Browserprimitive)
- https://github.com/browserify/createhash (verwendet https://github.com/browserify/sha.js hinter den Kulissen)
2.6 Beispiel
Kanalimplementierungen
Kanäle sind abstrakte Objekte zum Austausch von Daten in bidirektionaler Weise. Im Wesentlichen werden 2 Methoden benötigt:
send(data): void
zum Senden von Daten im Fire-and-Forget-Modusasync receive(): data
zum Warten auf den Empfang von Daten
Wir bieten 2 Implementierungen an:
P2P-Kanal
unter Verwendung von WebRTC (über die Bibliothek peer.js)Server/Browser-Kanal
, der auf- nativem
fetch()
für den Browser - expressjs- oder nextjs-Middleware für den Server basiert.
- nativem
Zum Testen gibt es ein Kanal-Mock
(verwendet RAM im selben Prozess)
Wir arbeiten an mehreren anderen Implementierungen wie Patr