Les réponses existantes qui s'appuient sur SJCL, CryptoJS, et/ou WebCrypto ne sont pas nécessairement faux mais ils ne sont pas aussi sûrs que vous pourriez le penser. En général, vous voulez utiliser libsodium . Je vais d'abord expliquer pourquoi, puis comment.
Pourquoi pas SJCL, CryptoJS, WebCrypto, etc.
Réponse courte : Pour que votre chiffrement soit réellement sûr, ces bibliothèques vous demandent de faire trop de choix, par exemple le mode de chiffrement par blocs (CBC, CTR, GCM) ; si vous ne pouvez pas dire lequel des trois que je viens de citer est sûr à utiliser et sous quelles contraintes, vous ne devriez pas avoir à faire ce genre de choix. du tout ).
A moins que votre titre de poste soit ingénieur en cryptographie les chances sont minces pour que vous l'implémentiez en toute sécurité.
Pourquoi éviter CryptoJS ?
CryptoJS offre une poignée de blocs de construction et attend de vous que vous sachiez comment les utiliser en toute sécurité. Il passe même par défaut en mode CBC ( archivé ).
Pourquoi le mode CBC est-il mauvais ?
Lire cet article sur les vulnérabilités de l'AES-CBC .
Pourquoi éviter WebCrypto ?
WebCrypto est une norme de type potluck, conçue par un comité, à des fins qui sont orthogonales à l'ingénierie de la cryptographie. Plus précisément, WebCrypto était destiné à remplacer Flash, pas à assurer la sécurité. .
Pourquoi éviter SJCL ?
L'API publique et la documentation de SJCL supplient les utilisateurs de chiffrer les données avec un mot de passe mémorisé par l'homme. C'est rarement, voire jamais, ce que vous voulez faire dans le monde réel.
En outre : Son nombre de tours PBKDF2 par défaut est d'environ 86 fois plus petit que vous ne le souhaitez . AES-128-CCM est probablement parfait.
Parmi les trois options ci-dessus, SJCL est la moins susceptible de se terminer en larmes. Mais il y a de meilleures options disponibles.
Pourquoi le Libsodium est-il meilleur ?
Vous n'avez pas besoin de choisir entre un menu de modes de chiffrement, de fonctions de hachage et d'autres options inutiles. Vous n'aurez jamais à risque de bousiller vos paramètres et d'enlever toute sécurité à votre protocole .
Au lieu de cela, libsodium ne vous propose que des options simples, conçues pour une sécurité maximale et des API minimalistes.
-
crypto_box()
/ crypto_box_open()
offrent un cryptage à clé publique authentifié.
- L'algorithme en question combine X25519 (ECDH sur Curve25519) et XSalsa20-Poly1305, mais il n'est pas nécessaire de le savoir (ni même de s'en soucier) pour l'utiliser de manière sécurisée.
-
crypto_secretbox()
/ crypto_secretbox_open()
offrent un cryptage authentifié à clé partagée.
- L'algorithme en question est XSalsa20-Poly1305, mais vous n'avez pas besoin de le savoir ou de vous en soucier.
De plus, libsodium a des liaisons dans des dizaines de langages de programmation populaires donc il est très probable que libsodium juste travailler lorsqu'on essaie d'interopérer avec une autre pile de programmation. De plus, libsodium a tendance à être très rapide sans sacrifier la sécurité.
Comment utiliser Libsodium en JavaScript ?
D'abord, vous devez décider d'une chose :
- Voulez-vous simplement crypter/décrypter des données (et peut-être encore utiliser le texte en clair dans des requêtes de base de données en toute sécurité) et ne pas vous soucier des détails ? Ou bien...
- Avez-vous besoin de mettre en œuvre un protocole spécifique ?
Si vous avez choisi la première option , obtenir CipherSweet.js .
La documentation est disponible en ligne . EncryptedField
est suffisante pour la plupart des cas d'utilisation, mais la EncryptedRow
y EncryptedMultiRows
Les API peuvent être plus faciles si vous avez beaucoup de champs distincts à crypter.
Avec CipherSweet, vous n'avez pas besoin de même savoir ce qu'est un nonce/IV pour l'utiliser en toute sécurité.
En outre, cela permet de traiter int
/ float
le cryptage sans fuite de données sur le contenu par la taille du texte chiffré.
Sinon, vous voudrez sodium-plus , qui est un frontal convivial pour divers wrappers libsodium. Sodium-Plus vous permet d'écrire du code performant, asynchrone, multiplateforme, facile à auditer et à raisonner.
Pour installer sodium-plus, il suffit d'exécuter...
npm install sodium-plus
Il n'y a actuellement aucun CDN public pour le support du navigateur. Cela changera bientôt. Cependant, vous pouvez récupérer sodium-plus.min.js
de la dernière version de Github si vous en avez besoin.
const { SodiumPlus } = require('sodium-plus');
let sodium;
(async function () {
if (!sodium) sodium = await SodiumPlus.auto();
let plaintext = 'Your message goes here';
let key = await sodium.crypto_secretbox_keygen();
let nonce = await sodium.randombytes_buf(24);
let ciphertext = await sodium.crypto_secretbox(
plaintext,
nonce,
key
);
console.log(ciphertext.toString('hex'));
let decrypted = await sodium.crypto_secretbox_open(
ciphertext,
nonce,
key
);
console.log(decrypted.toString());
})();
La documentation pour sodium-plus est disponible sur Github.
Si vous voulez un tutoriel étape par étape, cet article de dev.to a ce que vous cherchez.