Schlüsselhierarchie
Das kryptografische Modell von Passwork basiert auf einer Schlüsselhierarchie, bei der jede Ebene die nächste schützt.
Hierarchieübersicht
Master password
↓ (PBKDF2)
User master key
↓ (AES-256-CBC)
Private RSA key
↓ (RSA-OAEP)
Vault key
↓ (AES-256-CBC)
Record key
↓ (AES-256-CBC)
├── Record data
└── Attachment keys
↓ (AES-256-CBC)
File contents
Vollständiges Schlüsselschema
Ebene 0: Benutzeranmeldung
Der Benutzer gibt das Masterpasswort ein. Das Salt (20 Zeichen) wird vom Server abgerufen. PBKDF2 wird auf dem Client ausgeführt (300.000 Iterationen, SHA-256).
Ebene 1: Benutzer-Masterschlüssel
Das PBKDF2-Ergebnis ist der Masterschlüssel (512 Bit). Er wird für zwei Zwecke verwendet:
- Berechnung des SHA-256-Hashs zur Übermittlung an den Server (Passwortüberprüfung)
- Entschlüsselung des privaten RSA-Schlüssels des Benutzers (AES-256-CBC)
Ebene 2: RSA-Schlüssel
Der private RSA-Schlüssel (2048 Bit) wird auf dem Server in verschlüsselter Form gespeichert. Der öffentliche RSA-Schlüssel wird offen gespeichert. Der private Schlüssel wird zur Entschlüsselung von Tresorschlüsseln verwendet (RSA-OAEP).
Ebene 3: Tresorschlüssel
Der Tresorschlüssel (256 Bit) wird als separate Kopie für jeden Benutzer mit Zugang gespeichert. Jede Kopie wird mit dem öffentlichen RSA-Schlüssel des entsprechenden Benutzers verschlüsselt.
Ebene 4: Eintragschlüssel
Der Eintragschlüssel (256 Bit) wird mit dem Tresorschlüssel verschlüsselt. Er wird zur Verschlüsselung verwendet von: Passwortfeld, benutzerdefinierte Felder, TOTP-Geheimnis, Anhangsschlüssel.
Ebene 5: Anhangsschlüssel
Jede Datei hat ihren eigenen Anhangsschlüssel (256 Bit). Der Anhangsschlüssel wird mit dem Eintragschlüssel verschlüsselt. Der Dateiinhalt wird mit dem Anhangsschlüssel verschlüsselt.
Alternativer Pfad (Posteingang-Abschnitt)
Wenn ein Eintrag direkt an einen Benutzer übertragen wird (unter Umgehung des Tresors), wird der Eintragschlüssel direkt mit dem öffentlichen RSA-Schlüssel des Empfängers verschlüsselt.
Detaillierte Schlüsselbeschreibungen
Ebene 0: Masterpasswort
Das Masterpasswort ist ein Geheimnis, das nur dem Benutzer bekannt ist.
| Parameter | Wert |
|---|---|
| Mindestlänge | 12 Zeichen |
| Speicherung | Wird niemals gespeichert |
| Übertragung | Wird niemals an den Server übertragen |
| Verwendung | Eingabe bei jeder Anmeldung (oder Wiederherstellung aus localStorage) |
Ebene 1: Benutzer-Masterschlüssel
Der Masterschlüssel wird aus dem Masterpasswort mittels PBKDF2 abgeleitet.
| Parameter | Wert |
|---|---|
| Algorithmus | PBKDF2 |
| Hashfunktion | SHA-256 |
| Iterationen | 300.000 |
| Schlüssellänge | 512 Bit |
| Salt | 20 Zeichen, einzigartig pro Benutzer |
| Salt-Alphabet | A-Z, a-z, 0-9, @, ! (64 Zeichen) |
| Bibliothek | pbkdf2 (npm) |
Formel:
Master key = PBKDF2(master password, salt, 300000, 64, SHA-256)
Verwendung des Masterschlüssels:
- Entschlüsselung des privaten RSA-Schlüssels des Benutzers (AES-256-CBC)
- Berechnung des Hashs zur Serverüberprüfung (SHA-256)
Ebene 2: Benutzer-RSA-Schlüssel
Asymmetrisches Schlüsselpaar für den sicheren Austausch symmetrischer Schlüssel.
| Parameter | Wert |
|---|---|
| Algorithmus | RSA-OAEP |
| Moduluslänge | 2048 Bit |
| Öffentlicher Exponent | 65537 (0x010001) |
| Hashfunktion | SHA-256 |
| Speicherformat | PEM (PKCS#8 für privat, SPKI für öffentlich) |
| Bibliothek | WebCrypto API (crypto.subtle) |
Öffentlicher Schlüssel:
- Wird auf dem Server im Klartext gespeichert
- Wird zur Verschlüsselung von Tresorschlüsseln bei der Zugangsgewährung verwendet
Privater Schlüssel:
- Wird auf dem Server in verschlüsselter Form gespeichert
- Verschlüsselt mit dem Masterschlüssel des Benutzers (AES-256-CBC)
- Wird lokal nach Eingabe des Masterpassworts entschlüsselt
RSA-Schlüsselgenerierung: Die WebCrypto API generiert das Schlüsselpaar. Der öffentliche Schlüssel wird sofort an den Server gesendet. Der private Schlüssel wird mit dem Masterschlüssel über AES-256-CBC verschlüsselt und in verschlüsselter Form an den Server gesendet.
Ebene 3: Tresorschlüssel
Der Tresorschlüssel ist ein symmetrischer Schlüssel, der alle Einträge innerhalb des Tresors schützt.
| Parameter | Wert |
|---|---|
| Typ | Symmetrisch (AES-256-CBC) |
| Länge | 100 Zeichen |
| Alphabet | A-Z, a-z, 0-9, @, ! (64 Zeichen) |
| Eingabeentropie | ~596 Bit |
| Effektiver Schlüssel | 256 Bit (für AES-256) |
| Generierung | Auf dem Client bei Tresorerstellung |
| Generator | crypto.getRandomValues() (Browser-CSPRNG) |
Schlüsseltransformation: Die 100-Zeichen-Zeichenfolge wird über eine Schlüsselableitungsfunktion (KDF) in einen 256-Bit-AES-Schlüssel umgewandelt. Während der Verschlüsselung wird ein zufälliges 64-Bit-Salt generiert, das zusammen mit dem Originalschlüssel zur Ableitung des endgültigen 256-Bit-Schlüssels verwendet wird. Das Salt wird zusammen mit dem Chiffretext gespeichert.
Speicherung: Für jeden Benutzer mit Zugang wird eine separate Kopie des Tresorschlüssels erstellt. Jede Kopie wird mit dem öffentlichen RSA-Schlüssel des entsprechenden Benutzers verschlüsselt (RSA-OAEP). Alle Kopien werden auf dem Server gespeichert. Jeder Benutzer kann nur seine eigene Kopie mit seinem privaten RSA-Schlüssel entschlüsseln.
Ebene 4: Eintragschlüssel
Der Eintragschlüssel ist ein einzigartiger Schlüssel zur Verschlüsselung des Inhalts eines Eintrags. Er wird individuell für jeden Eintrag generiert.
| Parameter | Wert |
|---|---|
| Typ | Symmetrisch |
| Länge | 100 Zeichen |
| Alphabet | A-Z, a-z, 0-9, @, ! (64 Zeichen) |
| Eingabeentropie | ~596 Bit |
| Effektiver Schlüssel | 256 Bit (für AES-256) |
| Generierung | Auf dem Client bei Eintragserstellung |
| Generator | crypto.getRandomValues() (Browser-CSPRNG) |
| Speicherung | Verschlüsselt mit Tresorschlüssel (AES-256-CBC) |
Schlüsseltransformation: Die 100-Zeichen-Zeichenfolge wird über eine Schlüsselableitungsfunktion (KDF) in einen 256-Bit-AES-Schlüssel umgewandelt. Während der Verschlüsselung wird ein zufälliges 64-Bit-Salt generiert, das zusammen mit dem Originalschlüssel zur Ableitung des endgültigen 256-Bit-Schlüssels verwendet wird. Das Salt wird zusammen mit dem Chiffretext gespeichert.
- Vereinheitlichung — einheitliches Format für alle symmetrischen Schlüssel (Tresor, Eintrag, Anhang)
- Redundante Entropie — 596 Eingabe-Bits gewährleisten maximale Stärke des 256-Bit-Ausgabeschlüssels
- Zukunftssicherheit — der Wechsel zu längeren Schlüsseln erfordert keine Änderung der Generatoren
- Kollisionsschutz — die Wahrscheinlichkeit einer Schlüsselkollision ist praktisch null
Was mit dem Eintragschlüssel verschlüsselt wird (AES-256-CBC):
- Passwortfeld
- Alle benutzerdefinierten Felder (Name, Wert, Typ)
- TOTP-Geheimnis
- Anhangsschlüssel
- Eintragsrevisionen (vorherige Werte)
Initialisierungsvektor (IV): Für jede Verschlüsselungsoperation wird automatisch ein einzigartiger 128-Bit-IV generiert. Der IV ist im Verschlüsselungsergebnis enthalten.
Alternativer Pfad (Posteingang-Abschnitt): Wenn ein Eintrag direkt an einen Benutzer übertragen wird (ohne Tresorzugang), wird der Eintragschlüssel mit dem öffentlichen RSA-Schlüssel des Empfängers verschlüsselt.
Ebene 5: Anhangsschlüssel
Der Anhangsschlüssel ist ein einzigartiger Schlüssel zur Verschlüsselung einer Datei.
| Parameter | Wert |
|---|---|
| Typ | Symmetrisch |
| Länge | 100 Zeichen |
| Alphabet | A-Z, a-z, 0-9, @, ! (64 Zeichen) |
| Eingabeentropie | ~596 Bit |
| Effektiver Schlüssel | 256 Bit (für AES-256) |
| Generierung | Auf dem Client beim Hochladen einer Datei |
| Generator | crypto.getRandomValues() (Browser-CSPRNG) |
| Speicherung | Verschlüsselt mit Eintragschlüssel (AES-256-CBC) |
Schlüsseltransformation: Wie bei Tresor- und Eintragschlüsseln wird die 100-Zeichen-Zeichenfolge über KDF mit einem 64-Bit-Salt in einen 256-Bit-AES-Schlüssel umgewandelt.
Dateiverschlüsselungsprozess:
- Ein zufälliger Anhangsschlüssel (256 Bit) wird generiert
- Die Datei wird mit diesem Schlüssel verschlüsselt (AES-256-CBC)
- Der Anhangsschlüssel wird mit dem Eintragschlüssel verschlüsselt
- Beide verschlüsselten Objekte werden an den Server gesendet
Entschlüsselungskette
Entschlüsselungssequenz beim Zugriff auf einen Eintrag:
- Benutzer gibt das Masterpasswort ein
- Client fordert Salt und PBKDF2-Parameter vom Server an
- Client berechnet den Masterschlüssel:
PBKDF2(password, salt, 300000, 64, SHA-256) - Client berechnet den Hash:
SHA-256(master key) - Client sendet den Hash zur Überprüfung an den Server
- Server überprüft den Hash und gibt den verschlüsselten privaten RSA-Schlüssel zurück
- Client entschlüsselt den RSA-Schlüssel mit dem Masterschlüssel (AES-256-CBC)
- Client fordert Tresordaten an
- Server gibt den verschlüsselten Tresorschlüssel und die Einträge zurück
- Client entschlüsselt den Tresorschlüssel mit dem privaten RSA-Schlüssel (WebCrypto RSA-OAEP)
- Client entschlüsselt den Eintragschlüssel mit dem Tresorschlüssel (AES-256-CBC)
- Client entschlüsselt die Eintragsfelder mit dem Eintragschlüssel (AES-256-CBC)
- (Bei Bedarf) Client entschlüsselt den Anhangsschlüssel → entschlüsselt die Datei
Schlüsseleigenschaften-Tabelle
| Schlüssel | Algorithmus | Länge | Entropie | Generierungsort | Speicherort |
|---|---|---|---|---|---|
| Masterpasswort | — | ≥12 Zeichen | Abhängig vom Benutzer | Benutzer | Nirgends |
| PBKDF2-Salt | — | 20 Zeichen | ~120 Bit | Server | Server (offen) |
| Masterschlüssel | PBKDF2-SHA256 | 512 Bit | 512 Bit | Client | Nirgends (im Speicher) |
| Öffentlicher RSA-Schlüssel | RSA-OAEP | 2048 Bit | — | Client | Server (offen) |
| Privater RSA-Schlüssel | RSA-OAEP | 2048 Bit | — | Client | Server (verschlüsselt) |
| Tresorschlüssel | AES-256-CBC | 100 Zeichen → 256 Bit | ~596 Bit Eingabe | Client | Server (RSA-verschlüsselt) |
| Eintragschlüssel | AES-256-CBC | 100 Zeichen → 256 Bit | ~596 Bit Eingabe | Client | Server (verschlüsselt) |
| Anhangsschlüssel | AES-256-CBC | 100 Zeichen → 256 Bit | ~596 Bit Eingabe | Client | Server (verschlüsselt) |
| Serverschlüssel | AES-256-CFB | 256 Bit | 256 Bit | Server | Datei auf dem Server |
Sicherheitsprinzipien der Hierarchie
Ebenenisolierung
Die Kompromittierung eines Schlüssels auf einer Ebene gibt keine Schlüssel auf anderen Ebenen preis:
- Das Bekanntwerden eines Eintragschlüssels gibt keine anderen Einträge preis
- Das Bekanntwerden eines Tresorschlüssels gibt keine Einträge in anderen Tresoren preis
- Das Bekanntwerden eines privaten RSA-Schlüssels erfordert die Kenntnis des Masterschlüssels
Minimierte Speicherung
- Masterpasswort und Masterschlüssel werden nicht dauerhaft gespeichert
- Der private RSA-Schlüssel wird nur in verschlüsselter Form gespeichert
- Eintrags- und Anhangsschlüssel werden nur in verschlüsselter Form gespeichert
Schlüsseleinzigartigkeit
- Jeder Benutzer hat ein einzigartiges RSA-Schlüsselpaar
- Jeder Tresor hat einen einzigartigen Schlüssel
- Jeder Eintrag hat einen einzigartigen Schlüssel
- Jeder Anhang hat einen einzigartigen Schlüssel
Zero-Knowledge
Der Server speichert nur:
- Verschlüsselte Daten
- Verschlüsselte Schlüssel
- Öffentliche Schlüssel
- Hashes zur Überprüfung (die keine Wiederherstellung des Geheimnisses erlauben)
Der Server kann Benutzerdaten nicht entschlüsseln.