Voici une version simplifiée de la réponse fournie par Saptarshi Basu :
Modifications :
- Importer explicitement
Buffer
depuis le module buffer
- Supprimer les déclarations de variables inutiles
- Convertir une fois modifiées les variables
let
en variables const
(ou les omettre complètement)
- Convertir
module.exports
en un seul objet
- Déplacer les déclarations
exports.x = x = (...)
vers l'objet module.exports
- Simplifier et/ou réduire la documentation pour l'objet
ALGORITHM
Code :
const crypto = require("crypto");
const { Buffer } = require("buffer");
const ALGORITHM = {
// GCM est un mode de chiffrement authentifié qui assure la confidentialité et l'intégrité de façon sécurisée
BLOCK_CIPHER: "aes-256-gcm",
// Il est recommandé d'utiliser un tag d'authentification de 128 bits pour GCM
AUTH_TAG_BYTE_LEN: 16,
// Le NIST recommande un IV de 96 bits ou 12 octets pour GCM afin de favoriser l'interopérabilité, l'efficacité et la simplicité de conception
IV_BYTE_LEN: 12,
// REMARQUE : 256 (dans le nom de l'algorithme) est la taille de la clé (la taille de bloc pour AES est toujours de 128)
KEY_BYTE_LEN: 32,
// pour prévenir les attaques par table arc-en-ciel
SALT_BYTE_LEN: 16
};
module.exports = {
getRandomKey() {
return crypto.randomBytes(ALGORITHM.KEY_BYTE_LEN);
},
// pour prévenir les attaques par table arc-en-ciel
getSalt() {
return crypto.randomBytes(ALGORITHM.SALT_BYTE_LEN);
},
/**
*
* @param {Buffer} password - Le mot de passe à utiliser pour générer la clé
*
* À utiliser lorsque la clé doit être générée en fonction du mot de passe.
* L'appelant de cette fonction est responsable de vider
* le tampon après la génération de la clé pour empêcher le mot de passe
* de rester en mémoire
*/
getKeyFromPassword(password, salt) {
return crypto.scryptSync(password, salt, ALGORITHM.KEY_BYTE_LEN);
},
/**
*
* @param {Buffer} messagetext - Le message en clair à chiffrer
* @param {Buffer} key - La clé à utiliser pour le chiffrement
*
* L'appelant de cette fonction est responsable de vider
* le tampon après le chiffrement pour empêcher le texte du message
* et la clé de rester en mémoire
*/
encrypt(messagetext, key) {
const iv = crypto.randomBytes(ALGORITHM.IV_BYTE_LEN);
const cipher = crypto.createCipheriv(ALGORITHM.BLOCK_CIPHER, key, iv, {
authTagLength: ALGORITHM.AUTH_TAG_BYTE_LEN
});
let encryptedMessage = cipher.update(messagetext);
encryptedMessage = Buffer.concat([encryptedMessage, cipher.final()]);
return Buffer.concat([iv, encryptedMessage, cipher.getAuthTag()]);
},
/**
*
* @param {Buffer} ciphertext - Texte chiffré
* @param {Buffer} key - La clé à utiliser pour le déchiffrement
*
* L'appelant de cette fonction est responsable de vider
* le tampon après le déchiffrement pour empêcher le texte du message
* et la clé de rester en mémoire
*/
decrypt(ciphertext, key) {
const authTag = ciphertext.slice(-16);
const iv = ciphertext.slice(0, 12);
const encryptedMessage = ciphertext.slice(12, -16);
const decipher = crypto.createDecipheriv(ALGORITHM.BLOCK_CIPHER, key, iv, {
authTagLength: ALGORITHM.AUTH_TAG_BYTE_LEN
});
decipher.setAuthTag(authTag);
const messagetext = decipher.update(encryptedMessage);
return Buffer.concat([messagetext, decipher.final()]);
}
};
N'oubliez pas que bien que simplifié, ce code est censé être fonctionnellement identique à celui de Saptarshi Basu.
Bonne chance.