Les réponses existantes qui tirent parti de SJCL, CryptoJS et / ou WebCrypto ne sont pas nécessairement fausses, mais elles ne sont pas aussi sûres que vous pourriez le soupçonner au départ. Généralement, vous souhaitez utiliser libsodium . Je vais d'abord expliquer pourquoi, puis comment.
Pourquoi pas SJCL, CryptoJS, WebCrypto, etc.?
Réponse courte: pour que votre cryptage soit réellement sécurisé, ces bibliothèques s'attendent à ce que vous fassiez trop de choix, par exemple le mode de chiffrement par bloc (CBC, CTR, GCM; si vous ne pouvez pas dire lequel des trois que je viens d'énumérer est sécurisé utilisation et sous quelles contraintes, vous ne devriez pas être accablés par ce genre de choix du tout ).
À moins que votre titre de poste ne soit ingénieur en cryptographie , les chances sont contre vous de l'implémenter en toute sécurité.
Pourquoi éviter CryptoJS?
CryptoJS propose une poignée de blocs de construction et s'attend à ce 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?
Lisez cet article sur les vulnérabilités AES-CBC .
Pourquoi éviter WebCrypto?
WebCrypto est un standard potluck, conçu par un comité, à des fins orthogonales à l'ingénierie cryptographique. Plus précisément, WebCrypto était censé remplacer Flash et non assurer la sécurité .
Pourquoi éviter SJCL?
L'API publique et la documentation de SJCL demandent aux utilisateurs de crypter 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.
De plus: son nombre d'arrondis PBKDF2 par défaut est environ 86 fois plus petit que vous le souhaitez . AES-128-CCM est probablement bien.
Sur les trois options ci-dessus, SJCL est la moins susceptible de se terminer en larmes. Mais il existe de meilleures options disponibles.
Pourquoi 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 ne risquerez jamais de bousiller vos paramètres et de supprimer toute sécurité de votre protocole .
Au lieu de cela, libsodium vous propose simplement des options simples optimisées pour une sécurité maximale et des API minimalistes.
crypto_box()
/ crypto_box_open()
offre un cryptage à clé publique authentifié.
- L'algorithme en question combine X25519 (ECDH sur Curve25519) et XSalsa20-Poly1305, mais vous n'avez pas besoin de savoir (ni même de vous en soucier) pour l'utiliser en toute sécurité
crypto_secretbox()
/ crypto_secretbox_open()
offre un chiffrement authentifié par clé partagée.
- L'algorithme en question est XSalsa20-Poly1305, mais vous n'avez pas besoin de savoir / soins
De plus, libsodium a des liaisons dans des dizaines de langages de programmation populaires , il est donc très probable que libsodium fonctionnera simplement en essayant d'interagir 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?
Tout d'abord, vous devez décider d'une chose:
- Voulez-vous simplement crypter / décrypter les données (et peut-être encore utiliser le texte brut dans les requêtes de base de données en toute sécurité) et ne pas vous soucier des détails? Ou...
- Avez-vous besoin de mettre en œuvre un protocole spécifique?
Si vous avez sélectionné la première option , récupérez CipherSweet.js .
La documentation est disponible en ligne . EncryptedField
est suffisant pour la plupart des cas d'utilisation, mais les API EncryptedRow
et EncryptedMultiRows
peuvent être plus faciles si vous avez beaucoup de champs distincts à chiffrer.
Avec CipherSweet, vous n'avez même pas besoin de savoir ce qu'est un nonce / IV pour l'utiliser en toute sécurité.
De plus, cela gère int
/ float
cryptage sans divulguer des informations sur le contenu via la taille du texte chiffré.
Sinon, vous aurez besoin de sodium-plus , qui est une interface conviviale pour divers wrappers libsodium. Sodium-Plus vous permet d'écrire un code multiplateforme performant, asynchrone, facile à auditer et à raisonner.
Pour installer sodium-plus, exécutez simplement ...
npm install sodium-plus
Il n'existe actuellement aucun CDN public pour la prise en charge des navigateurs. Cela va bientôt changer. Cependant, vous pouvez récupérer sodium-plus.min.js
de la dernière version 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 de sodium-plus est disponible sur Github.
Si vous souhaitez un didacticiel pas à pas, cet article de dev.to a ce que vous recherchez.