Kryptographie in TypeScript: Verschlüsselung und Hashing — vollständiger Leitfaden
Moderne Webentwicklung ist ohne die Gewährleistung der Datensicherheit nicht denkbar. TypeScript, als Erweiterung von JavaScript, bietet leistungsstarke Werkzeuge zur Implementierung kryptographischer Funktionen sowohl auf der Client- als auch auf der Serverseite (Node.js). In diesem Artikel werden wir die grundlegenden kryptographischen Primitive im Detail behandeln: symmetrische und asymmetrische Verschlüsselung, Hashing sowie die Arbeit mit digitalen Signaturen. Alle Codebeispiele sind in TypeScript geschrieben und für den Einsatz in realen Projekten bereit.
1. Grundlagen der Kryptographie in TypeScript
Im TypeScript-Ökosystem gibt es zwei Hauptansätze für die Kryptographie:
- Web Crypto API — die integrierte API von Browsern und Node.js (ab Version 15), die einen Low-Level-Zugriff auf kryptographische Operationen bietet.
- Drittanbieter-Bibliotheken — wie
crypto-js,node-forge,bcryptjsfür spezifische Aufgaben.
Für die serverseitige Entwicklung mit Node.js wird die Verwendung des integrierten Moduls crypto empfohlen, das Teil der Plattform ist und keine Installation zusätzlicher Abhängigkeiten erfordert.
2. Daten-Hashing
Hashing ist eine einseitige Umwandlung von Daten mit fester Länge. Es wird zum Speichern von Passwörtern, zur Überprüfung der Dateiintegrität und zur Erstellung von Prüfsummen verwendet.
2.1. SHA-256 mit der Web Crypto API
async function hashSHA256(data: string): Promise<string> { const encoder = new TextEncoder(); const dataBuffer = encoder.encode(data); const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer); const hashArray = Array.from(new Uint8Array(hashBuffer)); return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');}
// Beispiel zur Verwendungconst myHash = await hashSHA256('Hallo, Welt!');console.log(myHash); // 64 Hex-Zeichen2.2. Passwort-Hashing mit bcrypt
Verwenden Sie für die sichere Speicherung von Passwörtern spezialisierte Algorithmen mit Salt, z. B. bcrypt:
import bcrypt from 'bcryptjs';
async function hashPassword(password: string): Promise<string> { const salt = await bcrypt.genSalt(12); // 12 Runden — eine gute Balance return await bcrypt.hash(password, salt);}
async function verifyPassword(password: string, hash: string): Promise<boolean> { return await bcrypt.compare(password, hash);}
// Beispielconst password = 'MeinSicheresPass!';const hashedPassword = await hashPassword(password);const isValid = await verifyPassword('MeinSicheresPass!', hashedPassword);console.log(isValid); // true3. Symmetrische Verschlüsselung
Symmetrische Verschlüsselung verwendet einen einzigen Schlüssel zum Ver- und Entschlüsseln von Daten. Der modernste und sicherste Algorithmus ist AES-GCM, der sowohl Vertraulichkeit als auch Authentifizierung bietet.
3.1. AES-GCM Verschlüsselung und Entschlüsselung
interface EncryptedData { iv: Uint8Array; ciphertext: Uint8Array; tag: Uint8Array;}
async function encryptAESGCM( plaintext: string, key: CryptoKey): Promise<EncryptedData> { const encoder = new TextEncoder(); const data = encoder.encode(plaintext); const iv = crypto.getRandomValues(new Uint8Array(12)); // 96-Bit IV const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, key, data ); // GCM fügt am Ende 16 Byte Authentifizierungstag hinzu const ciphertext = new Uint8Array(encrypted.slice(0, encrypted.byteLength - 16)); const tag = new Uint8Array(encrypted.slice(encrypted.byteLength - 16)); return { iv, ciphertext, tag };}
async function decryptAESGCM( encrypted: EncryptedData, key: CryptoKey): Promise<string> { // ciphertext und tag für Web Cry Auch in der Bibliothek
Swagger/OpenAPI-Generierung für Java: Die besten Bibliotheken
Arbeiten mit Excel in Java: Apache POI und Alternativen
Sharp für JavaScript (Node.js): Komplettguide mit Beispielen
WebSocket-Bibliotheken für Swift: Starscream und URLSessionWebSocketTask