Kryptographie in TypeScript: Verschlüsselung und Hashing in der Praxis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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, bcryptjs fü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-Zeichen


2.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); // true


3. 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

Empfehlungen