Cryptage et Hachage
Cryptage est le processus d’encodage des informations. Ce processus convertit la représentation originale des informations, connue sous le nom de texte clair, en une forme alternative appelée texte chiffré. Idéalement, seules les parties autorisées peuvent déchiffrer un texte chiffré pour retrouver le texte clair et accéder aux informations originales. Le cryptage ne prévient pas en soi l’interférence mais refuse le contenu intelligible à un éventuel intercepteur. Le cryptage est une fonction bidirectionnelle ; ce qui est chiffré peut être déchiffré avec la clé appropriée.
Hachage est le processus de conversion d’une clé donnée en une autre valeur. Une fonction de hachage est utilisée pour générer la nouvelle valeur selon un algorithme mathématique. Une fois le hachage effectué, il devrait être impossible de revenir de la sortie à l’entrée.
Cryptage
Node.js fournit un module crypto intégré que vous pouvez utiliser pour chiffrer et déchiffrer des chaînes, des nombres, des tampons, des flux, et plus encore. Nest lui-même ne fournit aucun package supplémentaire au-dessus de ce module afin d’éviter d’introduire des abstractions inutiles.
En exemple, utilisons l’algorithme de cryptage mode CTR AES (Advanced Encryption System) 'aes-256-ctr'
.
import { createCipheriv, randomBytes, scrypt } from 'crypto';import { promisify } from 'util';
const iv = randomBytes(16);const password = 'Password used to generate key';
// La longueur de la clé dépend de l'algorithme.// Dans ce cas, pour aes256, elle est de 32 octets.const key = await promisify(scrypt)(password, 'salt', 32) as Buffer;const cipher = createCipheriv('aes-256-ctr', key, iv);
const textToEncrypt = 'Nest';const encryptedText = Buffer.concat([ cipher.update(textToEncrypt), cipher.final(),]);
Maintenant pour déchiffrer la valeur encryptedText
:
import { createDecipheriv } from 'crypto';
const decipher = createDecipheriv('aes-256-ctr', key, iv);const decryptedText = Buffer.concat([ decipher.update(encryptedText), decipher.final(),]);
Hachage
Pour le hachage, nous recommandons d’utiliser soit le package bcrypt ou le package argon2. Nest lui-même ne fournit aucun wrapper supplémentaire au-dessus de ces modules pour éviter d’introduire des abstractions inutiles (ce qui réduit la courbe d’apprentissage).
En exemple, utilisons bcrypt
pour hacher un mot de passe aléatoire.
D’abord, installez les packages requis :
$ npm i bcrypt$ npm i -D @types/bcrypt
Une fois l’installation terminée, vous pouvez utiliser la fonction hash
, comme suit :
import * as bcrypt from 'bcrypt';
const saltOrRounds = 10;const password = 'random_password';const hash = await bcrypt.hash(password, saltOrRounds);
Pour générer un sel, utilisez la fonction genSalt
:
const salt = await bcrypt.genSalt();
Pour comparer/vérifier un mot de passe, utilisez la fonction compare
:
const isMatch = await bcrypt.compare(password, hash);
Vous pouvez en lire davantage sur les fonctions disponibles ici.