Kryptographie in Node.js: Verschlüsselung und Hashing mit dem Modul crypto
Datensicherheit ist einer der Schlüsselaspekte der modernen Webentwicklung. In Node.js bietet das integrierte Modul crypto leistungsstarke Werkzeuge für den kryptographischen Schutz: vom Hashing von Passwörtern bis zur asymmetrischen Verschlüsselung. In diesem Artikel werden wir die wichtigsten Funktionen des Moduls crypto im Detail besprechen, lernen, wie man Daten verschlüsselt und entschlüsselt, und wie man Passwörter sicher mit Hashing speichert.
1. Einbinden des Moduls crypto
Das Modul crypto ist integriert, daher ist keine Installation zusätzlicher Pakete erforderlich. Es wird auf die Standardmethode eingebunden:
const crypto = require('crypto');2. Hashing von Daten
Hashing ist der Prozess der Umwandlung von Daten beliebiger Länge in eine Zeichenkette fester Länge. Im Gegensatz zur Verschlüsselung ist eine Hash-Funktion irreversibel. Die gängigsten Algorithmen sind SHA-256, SHA-512.
Beispiel: Hashing eines Strings mit SHA-256
const data = 'PythonLib — Ihr Wegweiser in die IT-Welt';const hash = crypto.createHash('sha256').update(data).digest('hex');console.log('SHA-256 Hash:', hash);Beispiel: Hashing mit Salt (bcrypt)
Für die sichere Speicherung von Passwörtern wird die Verwendung des Algorithmus bcrypt oder scrypt empfohlen. Node.js bietet integrierte Unterstützung für scrypt:
const password = 'mySuperPassword123';const salt = crypto.randomBytes(16).toString('hex');
crypto.scrypt(password, salt, 64, (err, derivedKey) => { if (err) throw err; console.log('Passwort-Hash:', derivedKey.toString('hex'));});3. Symmetrische Verschlüsselung (AES)
Symmetrische Verschlüsselung verwendet denselben Schlüssel zum Verschlüsseln und Entschlüsseln von Daten. Der gebräuchlichste Algorithmus ist AES (Advanced Encryption Standard).
Datenverschlüsselung mit AES-256-CBC
const algorithm = 'aes-256-cbc';const key = crypto.randomBytes(32); // 256-Bit-Schlüsselconst iv = crypto.randomBytes(16); // Initialisierungsvektor
function encrypt(text) { const cipher = crypto.createCipheriv(algorithm, key, iv); let encrypted = cipher.update(text, 'utf8', 'hex'); encrypted += cipher.final('hex'); return { iv: iv.toString('hex'), encryptedData: encrypted };}
const originalText = 'Geheime Daten für PythonLib';const encrypted = encrypt(originalText);console.log('Verschlüsselte Daten:', encrypted);Datenentschlüsselung
function decrypt(encryptedObj) { const decipher = crypto.createDecipheriv( algorithm, key, Buffer.from(encryptedObj.iv, 'hex') ); let decrypted = decipher.update(encryptedObj.encryptedData, 'hex', 'utf8'); decrypted += decipher.final('utf8'); return decrypted;}
const decryptedText = decrypt(encrypted);console.log('Entschlüsselter Text:', decryptedText);4. Asymmetrische Verschlüsselung (RSA)
Asymmetrische Verschlüsselung verwendet ein Schlüsselpaar: einen öffentlichen (public) und einen privaten (private) Schlüssel. Mit dem öffentlichen Schlüssel werden Daten verschlüsselt, mit dem privaten entschlüsselt. Dies ist die Grundlage von HTTPS und digitalen Signaturen.
Generierung eines RSA-Schlüsselpaares
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' }});
console.log('Öffentlicher Schlüssel:', publicKey);console.log('Privater Schlüssel:', privateKey);Verschlüsselung und Entschlüsselung mit RSA
const secretMessage = 'Hallo, PythonLib!';
// Verschlüsselung mit öffentlichem Schlüsselconst encryptedData = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING }, Buffer.from(secretMessage));console.log('Verschl Auch in der Bibliothek
Supertest für JavaScript (Node.js): Komplettguide mit Beispielen
Maschinelles Lernen mit C#: Bibliotheken ML.NET und Accord.NET
Generierung von PDF-Berichten mit JavaScript (Node.js): Puppeteer, PDFKit, jsPDF
Elasticsearch .NET für C#: Vollständiges Tutorial mit Praxisbeispielen