Detaillierte Erläuterung des Nest.js-Hashing- und Verschlüsselungsbeispiels

Detaillierte Erläuterung des Nest.js-Hashing- und Verschlüsselungsbeispiels

0x0 Einführung

Zunächst einmal: Was ist ein Hash-Algorithmus? Ein Algorithmus, der einen Hashwert für ein bestimmtes Datenelement, beispielsweise eine Nachricht oder ein Sitzungselement, erzeugt. MD5 ist beispielsweise ein Hashing-Algorithmus. Eine Hash-Funktion oder ein Hash-Algorithmus in der Softwareentwicklung, auch Hashfunktion genannt, ist eine Methode zur Erstellung eines kleinen digitalen „Fingerabdrucks“ aus beliebigen Daten. Alle Hashfunktionen haben eine grundlegende Eigenschaft: Wenn zwei Hashwerte unterschiedlich sind (gemäß derselben Funktion), dann sind auch die ursprünglichen Eingaben der beiden Hashwerte unterschiedlich.

Verschlüsselungsalgorithmen werden üblicherweise in symmetrische und asymmetrische Verschlüsselungsalgorithmen unterteilt. Bei symmetrischen Verschlüsselungsalgorithmen müssen beide Parteien, die die Informationen erhalten, den Schlüssel sowie den Verschlüsselungs- und Entschlüsselungsalgorithmus im Voraus kennen und ihre Schlüssel müssen identisch sein. Dann können die Daten verschlüsselt und entschlüsselt werden. Der asymmetrische Algorithmus unterscheidet sich hiervon. Die sendenden Parteien A und B generieren im Voraus einen Schlüsselbund, und dann sendet A seinen öffentlichen Schlüssel an B und B sendet seinen öffentlichen Schlüssel an A. Wenn A eine Nachricht an B senden möchte, muss er zuerst den öffentlichen Schlüssel von B verwenden, um die Nachricht zu verschlüsseln, und sie dann an B senden. Zu diesem Zeitpunkt verwendet B seinen eigenen privaten Schlüssel, um die Nachricht zu entschlüsseln. Dasselbe Prinzip gilt, wenn B eine Nachricht an A sendet.

Im Wesentlichen verwandeln sowohl Hashing als auch Verschlüsselung ein Objekt in eine bedeutungslose Zeichenfolge. Der Unterschied besteht darin, dass das gehashte Objekt nicht wiederhergestellt werden kann und es sich um einen Einwegprozess handelt. Beispielsweise werden Passwörter normalerweise mithilfe eines Hash-Algorithmus verschlüsselt. Wenn ein Benutzer also sein Passwort vergisst, kann er es nur ändern, aber nicht an das ursprüngliche Passwort gelangen. Bei der Verschlüsselung von Informationen handelt es sich jedoch um einen herkömmlichen Verschlüsselungsalgorithmus, und die verschlüsselten Informationen können mit dem geheimen Schlüssel entschlüsselt und wiederhergestellt werden.

Hashing und Verschlüsselung

Hashing ist der Prozess der Konvertierung eines Schlüsselwerts in einen anderen Schlüsselwert durch einen mathematischen Algorithmus. Die Hash-Funktion wird verwendet, um die Konvertierung zu generieren, und der Ausgabeinhalt kann nicht wiederhergestellt werden. Es wird hauptsächlich zur Kennwortspeicherung verwendet, wenn Daten gehasht werden müssen.

Unter Verschlüsselung versteht man die Verschlüsselung von Informationen, also die Umwandlung der ursprünglichen Informationen in Geheimtext. Sie wird im Allgemeinen verwendet, wenn der Client vertrauliche Informationen wie Passwörter an den Server sendet. Die Informationen werden vor dem Senden verschlüsselt und dann auf dem Server entschlüsselt.

0x1-Hashing

Das Node.js-Ökosystem hat viele Abhängigkeiten, wie Bcrypt und Argon2, die einfach zu verwenden sind. Dieses Mal wird Bcrypt verwendet, um den Hash-Prozess zu implementieren:

Garn fügt bcrypt hinzu
Garn addieren @types/bcrypt -D

Dann kapseln Sie das gehashte Geschäft:

importiere { Injectable } von '@nestjs/common'
importiere * als bcrypt von 'bcrypt'

@Injizierbar()
Exportklasse BcryptService {
 private statische schreibgeschützte SALT_ROUNDS: Zahl = 10
 /**
 * Passwort vergleichen und prüfen * @param rawStr
 * @param hashedStr
 */
 asynchroner Vergleich(rawStr: Zeichenfolge, hashedStr: Zeichenfolge) {
 gibt bcrypt.compare(rawStr, hashedStr) zurück
 }
 /**
 * Hash generieren
 * @param rawStr
 * @param Salz
 */
 asynchroner Hash (rawStr: Zeichenfolge, Salt?: Zeichenfolge) {
 gibt bcrypt.hash zurück (rawStr, salt || BcryptService.SALT_ROUNDS)
 }
 /**
 * Salz erzeugen */
 async genSalt() {
 gibt bcrypt.genSalt zurück (BcryptService.SALT_ROUNDS)
 }
}

0x2-Verschlüsselung

Das Node.js-System verfügt über ein Verschlüsselungsmodul, das zum Verschlüsseln und Entschlüsseln sowie für andere damit verbundene Vorgänge verwendet werden kann. Im Folgenden wird die AES-256-CTR-Verschlüsselung zum Verschlüsseln von Daten verwendet:

importiere { createCipheriv, randomBytes } von 'crypto'
importiere { promisify } von 'util'

const iv = zufälligeBytes(16)
const password = 'Zum Generieren des Schlüssels verwendetes Passwort'

// Die Schlüssellänge hängt vom Algorithmus ab // Bei aes256 ist sie 32 Bytes lang const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer
const cipher = createCipheriv('aes-256-ctr', Schlüssel, iv)

const textToEncrypt = "Nest"
const verschlüsselterText = Buffer.concat([
 cipher.update(Zuverschlüsselnder Text),
 cipher.final()
])

Wenn Sie entschlüsseln müssen, ist das auch ganz einfach:

importiere { createDecipheriv } von 'crypto'

const decipher = createDecipheriv('aes-256-ctr', Schlüssel, iv)
const entschlüsselterText = Buffer.concat([
 decipher.update(verschlüsselterText),
 entschlüsseln.final()
])

0x3 Referenz

Verschlüsselung und Hashing

Node.js-Krypto

node.bcrypt.js

Zusammenfassen

Dies ist das Ende dieses Artikels über Nest.js-Hashing und -Verschlüsselung. Weitere verwandte Inhalte zu Nest.js-Hashing und -Verschlüsselung finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

<<:  Beispielcode für die Master-Slave-Trennung einer MySQL-Datenbank

>>:  Beispiel für eine Domänennamenüberprüfungsmethode für Betrieb und Wartung von Nginx

Artikel empfehlen

So überprüfen Sie die Festplattengröße und mounten die Festplatte in Linux

Es gibt zwei Arten von Festplatten in Linux: gemo...

Vue implementiert einen einfachen Lupeneffekt

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erläuterung der Vue-Projektoptimierung und -verpackung

Inhaltsverzeichnis Vorwort 1. Lazy Loading-Routin...

Detaillierter Installationsprozess von MySQL5.6.40 unter CentOS7 64

MySQL5.6.40-Installationsprozess unter CentOS7 64...

Ubuntu führt regelmäßig Beispielcode eines Python-Skripts aus

Originallink: https://vien.tech/article/157 Vorwo...

Vergleich mehrerer Beispiele zur Einfügungseffizienz in MySQL

Vorwort Aus beruflichen Gründen musste ich kürzli...

Ursachenanalyse und Lösung des E/A-Fehlers beim Löschen einer MySQL-Tabelle

Problemphänomen Ich habe kürzlich Sysbench verwen...

Vue + Element dynamische Mehrfachheader und dynamische Slots

Inhaltsverzeichnis 1. Nachfrage 2. Wirkung 3. All...

Installationsprozess von CentOS8 Linux 8.0.1905 (Abbildung)

Die aktuellste Version von CentOS ist CentOS 8. A...

Informationen zur Installation von Homebrew auf dem Mac

Vor kurzem hat Xiao Ming einen neuen Mac gekauft ...

So ändern Sie das Root-Passwort von MySQL in Docker

Der erste Schritt besteht darin, einen MySQL-Cont...

Ausführliche Erläuterung der Mysql-Deadlock-Anzeige und Deadlock-Entfernung

Vorwort Vor einiger Zeit ist bei mir ein MySQL-De...

HTML-Tabellen-Tag-Tutorial (44): Tabellenkopfzeilen-Tag

<br />Um die Tabellenstruktur im Quellcode d...

Vue implementiert die Drag & Drop-Funktion für Bilder

In diesem Artikelbeispiel wird der spezifische Co...