Zum Hauptinhalt springen

Kryptografische Algorithmen

Passwork verwendet unterschiedliche kryptografische Algorithmen auf dem Server und dem Client.

Algorithmenübersicht

ZweckAlgorithmusEinsatzort
Schlüsselableitung aus PasswortPBKDF2Masterschlüssel-Generierung
Symmetrische Verschlüsselung (Server)AES-256-CFBServer-seitige Datenbankverschlüsselung
Symmetrische Verschlüsselung (Client)CryptoJS AES-256-CBCAlle Client-Daten
Asymmetrische VerschlüsselungRSA-OAEPSchlüsselaustausch
HashingSHA-256, SHA-512Passwortüberprüfung, Integrität
ZufallszahlengenerierungWebCrypto APISchlüsselgenerierung, IV, Salt

PBKDF2 (Password-Based Key Derivation Function 2)

PBKDF2 wird verwendet, um einen kryptografischen Schlüssel aus dem Masterpasswort des Benutzers abzuleiten.

Client-Parameter

ParameterWert
AlgorithmusPBKDF2
HashfunktionSHA-256
Iterationen300.000
Ausgabeschlüssellänge512 Bit
Salt20 Zeichen, einzigartig pro Benutzer
Bibliothekpbkdf2 (npm)

Server-Parameter

ParameterWert
AlgorithmusPBKDF2
HashfunktionSHA-512
Iterationen600.000
Ausgabeschlüssellänge512 Bit
BibliothekPHP hash_pbkdf2()
Parameterunterschiede

SHA-256 mit 300.000 Iterationen wird auf dem Client verwendet, um ein Gleichgewicht zwischen Sicherheit und Browser-Performance zu gewährleisten. Strengere Parameter (SHA-512, 600.000 Iterationen) werden auf dem Server für das Authentifizierungspasswort-Hashing angewendet.

Salt

ParameterWert
Länge20 Zeichen
AlphabetA-Z, a-z, 0-9, @, ! (64 Zeichen)
Entropie~120 Bit
GenerierungServer, kryptografisch sicher
SpeicherungServer, im Benutzerprofil
EinzigartigkeitEinzigartig pro Benutzer
Server-seitige Generierung

Das Salt wird immer auf dem Server generiert und an den Client übermittelt. Der Client generiert kein Salt eigenständig, wodurch die Verwendung eines kryptografisch sicheren Generators sichergestellt wird.

Ergebnisformat

Das PBKDF2-Ergebnis auf dem Client wird als Zeichenfolge kodiert:

pbkdf:sha256:300000:64:{salt}

Zweck der hohen Iterationsanzahl

Eine hohe Iterationsanzahl (300.000+) verlangsamt Brute-Force-Angriffe erheblich:

  • Jeder Versuch benötigt erhebliche Zeit
  • Paralleles GPU-Brute-Forcing wird erschwert
  • Vorberechnete Tabellen sind aufgrund des einzigartigen Salts unmöglich

Automatische Hash-Migration

Das System unterstützt die automatische Migration von PBKDF2-Hashes bei Parameteränderungen.

Server-Hash-Format:

pbkdf:{base64_hash}:{algorithm}:{iterations}:{length}:{salt}

Beispiel: pbkdf:Abc123...==:sha512:600000:64:xY3zKmN9qR2w...

Migrationsmechanismus:

  1. Benutzer meldet sich am System an
  2. System prüft die vorhandenen Hash-Parameter
  3. Falls die Parameter von den aktuellen Einstellungen abweichen → Neuhashing erforderlich
  4. Das Passwort wird automatisch mit neuen Parametern gehasht
  5. Der neue Hash wird in der Datenbank gespeichert

Was aktualisiert werden kann:

ParameterAktueller WertBeispiel neuer Werte
Hash-AlgorithmusSHA-512SHA3-512, BLAKE2b512
Iterationsanzahl600.0001.000.000, 2.000.000
Schlüssellänge512 Bit256, 1024 Bit
Schrittweise Migration

Bei Parameteraktualisierungen:

  • Neue Benutzer → erhalten sofort Hashes mit neuen Parametern
  • Bestehende Benutzer → Migration erfolgt bei der nächsten Anmeldung
  • Benutzer ohne Anmeldung → alte Hashes funktionieren weiterhin

Die Migration ist für Benutzer transparent — sie geben einfach ihr Passwort wie gewohnt ein.


AES (Advanced Encryption Standard)

Passwork verwendet unterschiedliche AES-Modi auf Server und Client.

Server-Verschlüsselung: AES-256-CFB

AES-256 im CFB-Modus (Cipher Feedback) über OpenSSL wird auf dem Server verwendet.

ParameterWert
AlgorithmusAES-256-CFB
Schlüssellänge256 Bit
Blockgröße128 Bit
Initialisierungsvektor (IV)128 Bit, zufällig pro Verschlüsselung
BibliothekOpenSSL (über PHP)

Eigenschaften des CFB-Modus:

  • Stromchiffre-Modus
  • Kein Padding erforderlich
  • IV wird zusammen mit dem Chiffretext gespeichert

Verwendung: Verschlüsselung von Daten in der Datenbank (externe Links, Einstellungen, LDAP/SMTP-Passwörter).

Server-IV-Generierung:

ParameterWert
Länge128 Bit
GeneratorKryptografisch sicher (OS CSPRNG)
EinzigartigkeitNeuer IV für jede Verschlüsselungsoperation
SpeicherungAm Anfang der verschlüsselten Daten

Struktur der verschlüsselten Daten: [128 Bit IV][Chiffretext]

Client-Verschlüsselung: CryptoJS AES-256-CBC

Die CryptoJS-Bibliothek wird auf dem Client für alle symmetrischen Verschlüsselungsoperationen verwendet.

ParameterWert
BibliothekCryptoJS
ModusCBC (Cipher Block Chaining)
Schlüssellänge256 Bit
PaddingPKCS#7
IVAutomatisch (128 Bit)
KDFIntegrierte Schlüsselableitungsfunktion
AusgabekodierungBase32

Schlüsseltransformation zu AES-256:

Symmetrische Schlüssel in Passwork sind 100 Zeichen (~596 Bit Entropie), aber AES-256 benötigt exakt einen 256-Bit-Schlüssel. CryptoJS führt die Transformation automatisch über eine Schlüsselableitungsfunktion (KDF) durch:

  1. Ein zufälliges 64-Bit-Salt wird generiert
  2. Der ursprüngliche 100-Zeichen-Schlüssel wird in einen 256-Bit-AES-Schlüssel umgewandelt
  3. Das Salt wird zusammen mit dem Chiffretext zur Entschlüsselung gespeichert
Warum redundante Entropie?

Die Eingabe von 596 Bit garantiert maximale Stärke des 256-Bit-Ausgabeschlüssels. Dies gewährleistet auch Vereinheitlichung — alle symmetrischen Schlüssel (Tresor, Eintrag, Anhang) werden identisch generiert.

Client-IV-Generierung:

CryptoJS generiert automatisch einen IV für jede Verschlüsselung:

ParameterWert
Länge128 Bit
Generatorwindow.crypto.getRandomValues()
EinzigartigkeitNeuer IV für jede Verschlüsselungsoperation
SpeicherformatIm OpenSSL-kompatiblen Format enthalten

CryptoJS-Ausgabeformat: "Salted__" + [64 Bit Salt] + [Chiffretext mit IV] → Base64

Warum unterschiedliche Modi?

KriteriumServer (CFB)Client (CBC)
BibliothekOpenSSLCryptoJS
AuswahlgrundPHP-StandardAbwärtskompatibilität
VorteileStrommodusBreite Unterstützung

CryptoJS vs. WebCrypto API

Die CryptoJS-Bibliothek wird für die symmetrische Verschlüsselung auf dem Client verwendet, nicht die native WebCrypto API. Hier ein Vergleich.

Vergleich:

AspektCryptoJSWebCrypto API
ImplementierungReines JavaScriptNativer Browser-Code
PerformanceLangsamerDeutlich schneller
Schutz vor Timing-AngriffenKeine GarantienSchutz auf Implementierungsebene
SpeicherverwaltungSchlüssel im JS-HeapSchlüssel können nicht-extrahierbar sein
APISynchronAsynchron (Promise)
KompatibilitätJede JS-UmgebungNur moderne Browser

Warum CryptoJS verwendet wird:

  1. Abwärtskompatibilität — vorhandene verschlüsselte Daten verwenden das CryptoJS-Format
  2. Synchrone API — einfachere Integration mit bestehendem Codebase
  3. Universalität — funktioniert in jeder JavaScript-Umgebung

Sicherheitsmaßnahmen in der aktuellen Implementierung:

  • PBKDF2 über separate Bibliothek — Masterschlüssel wird über kryptografisch starkes PBKDF2 abgeleitet
  • WebCrypto für RSA — kritische asymmetrische Operationen werden über die native API durchgeführt
  • Kryptografisch sichere IV-Generierung — über crypto.getRandomValues(), nicht Math.random()
  • Daten werden einmal verschlüsselt — Timing-Angriffe erfordern mehrere Operationen mit demselben Schlüssel

Risikobewertung:

BedrohungRisikostufeBegründung
Timing-AngriffeNiedrigErfordert lokalen Browser-Zugriff
Speicher-ExpositionNiedrigMit solchem Zugriff ist es einfacher, das Passwort bei der Eingabe abzufangen
Bekannte CVEMinimalDie verwendete CryptoJS-Version hat keine kritischen Schwachstellen
Zukünftige Entwicklung

Zukünftige Versionen planen den schrittweisen Übergang zur WebCrypto API für symmetrische Verschlüsselung. Dies wird ermöglichen:

  • Verwendung von AES-GCM (authentifizierte Verschlüsselung) anstelle von AES-CBC
  • 10-100-fache Performance-Verbesserung
  • Schlüsselschutz auf Browser-Ebene

Die Migration wird mit Abwärtskompatibilität für vorhandene Daten durchgeführt.


RSA (Rivest–Shamir–Adleman)

RSA wird für asymmetrische Verschlüsselung verwendet — sicherer Austausch symmetrischer Schlüssel zwischen Benutzern.

Parameter

ParameterWert
AlgorithmusRSA-OAEP
Moduluslänge2048 Bit
Öffentlicher Exponent65537 (0x010001)
HashfunktionSHA-256
BibliothekWebCrypto API (crypto.subtle)

Schlüsselgenerierung

RSA-Schlüssel werden auf dem Client mit der WebCrypto API generiert:

crypto.subtle.generateKey({
name: 'RSA-OAEP',
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: 'SHA-256'
}, true, ['encrypt', 'decrypt'])

Speicherformate

SchlüsselFormatBeschreibung
ÖffentlichSPKI (PEM)SubjectPublicKeyInfo
PrivatPKCS#8 (PEM)Verschlüsselt mit Masterschlüssel

Unterstützte Formate

Das System unterstützt den Schlüsselimport in folgenden Formaten:

  • PKCS#1-----BEGIN RSA PRIVATE KEY-----
  • PKCS#8-----BEGIN PRIVATE KEY-----
  • SPKI-----BEGIN PUBLIC KEY-----
  • JWK — JSON Web Key (zur Konvertierung)

Abwärtskompatibilität

Für ältere 1024-Bit-Schlüssel wird ein JSEncrypt-Bibliotheks-Fallback verwendet, da die WebCrypto API RSA-1024 nicht unterstützt.

Warum RSA-2048?

AspektBeschreibung
SicherheitÄquivalent zu 112 Bit symmetrischer Verschlüsselung
PerformanceAkzeptable Geschwindigkeit im Browser
KompatibilitätBreite Unterstützung in allen Browsern

Hashing

SHA-256

ParameterWert
Hash-Länge256 Bit
Bibliothek (Client)js-sha256
VerwendungMasterschlüssel-Hash, PBKDF2, RSA-OAEP

SHA-512

ParameterWert
Hash-Länge512 Bit
Bibliothek (Client)js-sha512
Bibliothek (Server)PHP hash()
VerwendungServer-PBKDF2, Serverschlüssel-Hash, Suchindizes

Zufallszahlengenerierung

Alle kryptografischen Parameter werden mit kryptografisch sicheren Zufallszahlengeneratoren (CSPRNG) generiert.

Entropiequellen

Server (PHP)

GeneratorEntropiequelleVerwendung
random_bytes()OS CSPRNGBinärdaten (Schlüssel, Token)
random_int()OS CSPRNGZeichenfolgen (Salts, Codes)

OS-Entropiequellen:

  • Linux: /dev/urandom, getrandom()-Systemaufruf
  • Windows: CryptGenRandom() (CryptoAPI)
  • macOS: arc4random_buf()

Client (JavaScript)

GeneratorEntropiequelleVerwendung
window.crypto.getRandomValues()Browser/OS CSPRNGZahlen, Arrays
CryptoJS.lib.WordArray.random()crypto.getRandomValues()IV für AES

Browser-Entropiequellen:

  • Chromium/Electron: BoringSSL CSPRNG
  • Firefox: NSS (Network Security Services)
  • Safari: CommonCrypto (Apple)

Kryptografische Stärkegarantien

EigenschaftGarantie
UnvorhersagbarkeitNächster Wert nicht vorhersagbar
GleichverteilungAlle Werte gleich wahrscheinlich
UnverzerrtRejection Sampling wird verwendet
VerfügbarkeitGeneratoren blockieren nicht

Generierte Schlüssel und Token

Was generiert wirdLängeAlphabetEntropie
Symmetrische Schlüssel
Tresorschlüssel100 ZeichenA-Z, a-z, 0-9, @, !~596 Bit
Eintragschlüssel100 ZeichenA-Z, a-z, 0-9, @, !~596 Bit
Anhangsschlüssel100 ZeichenA-Z, a-z, 0-9, @, !~596 Bit
Link-Schlüssel100 Zeichen → 256 BitA-Z, a-z, 0-9, @, !~596 Bit Eingabe
Serververschlüsselungsschlüssel256 BitBinär256 Bit
Salts
PBKDF2-Salt20 ZeichenA-Z, a-z, 0-9, @, !~120 Bit
Tresor-Salt32 ZeichenA-Z, a-z, 0-9, @, !~190 Bit
Token und Geheimnisse
Secret Code (localStorage)100 ZeichenA-Z, a-z, 0-9~596 Bit
Extension Secret60 ZeichenA-Z, a-z, 0-9~357 Bit
Auth Token (Erweiterung)400 BitHex400 Bit
Externer Link-Token43 ZeichenA-Z, a-z, 0-9~256 Bit
Sitzungstoken
Access Token256 BitBase64256 Bit
Refresh Token256 BitBase64256 Bit
Initialisierungsvektoren
IV (Server, AES-CFB)128 BitBinär128 Bit
IV (Client, AES-CBC)128 BitBinär128 Bit

Token-Einzigartigkeitsüberprüfung

Für Token, die garantierte Einzigartigkeit erfordern (Link-Token, Einladungscodes), wird eine Datenbankprüfung durchgeführt:

  1. Zufälliges Token wird generiert
  2. Einzigartigkeit wird in der Datenbank geprüft
  3. Bei Kollision — Neugenerierung
  4. Garantiert einzigartiges Token wird zurückgegeben

Kollisionswahrscheinlichkeit:

  • 43 Zeichen aus 62: ~10^77 Kombinationen
  • Bei einer Milliarde Token: Kollisionswahrscheinlichkeit ≈ 10^-59
  • Praktisch unmöglich

Kryptografische Bibliotheken

Client (JavaScript/TypeScript)

BibliothekZweck
WebCrypto APIRSA-Operationen, Zufallszahlen
CryptoJSAES-Verschlüsselung (alle Daten)
js-sha256SHA-256-Hashing
js-sha512SHA-512-Hashing
pbkdf2PBKDF2-Schlüsselableitung
node-jsencryptRSA-Fallback (1024 Bit)
pem-jwkPEM ↔ JWK-Konvertierung
totp-generatorTOTP-Code-Generierung

Server (PHP)

KomponenteZweck
OpenSSLAES-256-CFB-Verschlüsselung
hash()SHA-256, SHA-512-Hashing
hash_pbkdf2()PBKDF2-Schlüsselableitung
random_bytes()Zufallsdatengenerierung

Vergleich mit Industriestandards

ParameterPassworkNIST-Empfehlungen (2024)Status
Symmetrische VerschlüsselungAES-256AES-128/192/256
Asymmetrische VerschlüsselungRSA-2048RSA-2048+
HashingSHA-256/512SHA-2-Familie
PBKDF2-Iterationen300K/600K≥310K (SHA-256)
ZufallszahlengeneratorCSPRNGCSPRNG