Kryptographie in TypeScript: Verschlüsselung und Hashing
Moderne Webentwicklung ist ohne die Gewährleistung der Datensicherheit nicht denkbar. TypeScript, als streng typisierte Erweiterung von JavaScript, bietet Entwicklern leistungsstarke Werkzeuge zur Implementierung kryptografischer Algorithmen. In diesem Artikel betrachten wir die wichtigsten Methoden der Verschlüsselung und des Hashings, die im TypeScript-Ökosystem verfügbar sind, und zeigen, wie man sie in der Praxis anwendet.
Warum ist Kryptographie in TypeScript wichtig?
TypeScript wird sowohl für das Frontend als auch für das Backend (über Node.js) häufig verwendet. In beiden Fällen besteht die Notwendigkeit, vertrauliche Daten zu schützen: Benutzerpasswörter, Authentifizierungstoken, Nachrichteninhalte. Ohne angemessenen kryptografischen Schutz können Daten abgefangen oder kompromittiert werden.
Kryptographie in TypeScript löst drei Hauptaufgaben:
- Vertraulichkeit — Verschlüsselung von Daten, damit Unbefugte sie nicht lesen können.
- Integrität — Garantie, dass Daten während der Übertragung nicht verändert wurden.
- Authentifizierung — Überprüfung der Echtheit der Datenquelle.
Wichtige kryptografische Bibliotheken für TypeScript
In TypeScript können sowohl integrierte Browser-APIs als auch Drittanbieter-Bibliotheken verwendet werden. Betrachten wir die gängigsten Optionen:
1. Web Crypto API (im Browser integriert)
Standard-API, verfügbar in modernen Browsern und Node.js (ab Version 15). Erfordert keine Installation zusätzlicher Pakete. Unterstützt AES, RSA, SHA und vieles mehr.
2. crypto (Node.js-Bibliothek)
Integriertes Node.js-Modul, das eine breite Palette kryptografischer Funktionen bietet. Für TypeScript ist die Installation der Typen erforderlich: npm install @types/node.
3. bcrypt / bcryptjs
Spezialisierte Bibliothek zum Hashing von Passwörtern. Empfohlen für die Speicherung von Benutzerpasswörtern dank integriertem Salt-Schutz.
4. tweetnacl / nacl
Bibliothek für Public-Key-Verschlüsselung (NaCl). Zeichnet sich durch hohe Leistung und einfache Bedienung aus.
Datenverschlüsselung in TypeScript
Betrachten wir zwei Haupttypen der Verschlüsselung: symmetrisch (ein Schlüssel) und asymmetrisch (Schlüsselpaar).
Symmetrische Verschlüsselung mit AES-GCM
AES (Advanced Encryption Standard) im GCM-Modus bietet sowohl Verschlüsselung als auch Integritätsprüfung der Daten. Beispielimplementierung in TypeScript mit der Web Crypto API:
// AES-GCM-Verschlüsselungsfunktionasync function encryptAESGCM( plaintext: string, password: string): Promise<{ iv: Uint8Array; ciphertext: Uint8Array }> { const encoder = new TextEncoder(); const keyMaterial = await crypto.subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveBits', 'deriveKey'] );
const key = await crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode('my-salt'), iterations: 100000, hash: 'SHA-256', }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt'] );
const iv = crypto.getRandomValues(new Uint8Array(12)); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, encoder.encode(plaintext) );
return { iv, ciphertext: new Uint8Array(encrypted), };}
// Beispiel zur Verwendungconst { iv, ciphertext } = await encryptAESGCM('Geheime Nachricht', 'mein-passwort');console.log('Verschlüsselte Daten:', ciphertext);Asymmetrische Verschlüsselung mit RSA-OAEP
RSA verwendet ein Schlüsselpaar: einen öffentlichen Schlüssel zum Verschlüsseln und einen privaten Schlüssel zum Entschlüsseln. Beispiel zur Schlüsselgenerierung und Verschlüsselung:
// Generierung eines RSA-Schlüsselpaarsasync function generateRSAKeyPair(): Promise<CryptoKeyPair> { return await crypto.subtle.generateKey( { name: