Datenverschlüsselung
Regeln
- TLS überall: HTTP auf HTTPS umleiten, HSTS-Header setzen, niemals unverschlüsselte Verbindungen zulassen
- PII-Spalten auf Anwendungsebene mit AES-256-GCM verschlüsseln, bevor sie in der Datenbank gespeichert werden
- E-Mails mit SHA-256 für die Suche hashen, mit AES-256-GCM für die Anzeige verschlüsseln – ermöglicht Suche ohne Datenoffenlegung
- Passwörter: nur bcrypt oder argon2id – niemals SHA, MD5 oder umkehrbare Verschlüsselung
- Datenbank-Backups verschlüsseln und Verschlüsselungsschlüssel getrennt von den Daten speichern
crypto.subtle für clientseitige Verschlüsselung, node:crypto für serverseitige Verschlüsselung verwenden
- Verschlüsselungsschlüssel in einem Secrets-Manager speichern, niemals im Code oder zusammen mit verschlüsselten Daten
import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
const ENCRYPTION_KEY = Buffer.from(process.env.ENCRYPTION_KEY!, "hex");
function encrypt(plaintext: string): string {
const iv = randomBytes(12);
const cipher = createCipheriv("aes-256-gcm", ENCRYPTION_KEY, iv);
const encrypted = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
const tag = cipher.getAuthTag();
return Buffer.concat([iv, tag, encrypted]).toString("base64");
}
function decrypt(ciphertext: string): string {
const buf = Buffer.from(ciphertext, "base64");
const iv = buf.subarray(0, 12);
const tag = buf.subarray(12, 28);
const encrypted = buf.subarray(28);
const decipher = createDecipheriv("aes-256-gcm", ENCRYPTION_KEY, iv);
decipher.setAuthTag(tag);
return decipher.update(encrypted) + decipher.final("utf8");
}
Vermeiden
- Speicherung von PII im Klartext – ein Datenbankleck legt alles offen
- Verwendung des ECB-Modus oder von AES ohne Authentifizierung (CBC ohne HMAC) – GCM verwenden
- MD5 oder SHA für Passwort-Hashing – diese sind keine Passwort-Hashing-Algorithmen
- Hartcodieren von Verschlüsselungsschlüsseln im Quellcode – Umgebungsvariablen oder einen KMS verwenden
- Senden sensibler Daten über HTTP, selbst intern – TLS für alle Verbindungen verwenden