Je suis intéressé par la création d'une petite application à usage personnel qui cryptera et décryptera les informations côté client à l'aide de JavaScript. Les informations chiffrées seront stockées dans une base de données sur un serveur, mais jamais la version déchiffrée.
Il n'est pas nécessaire que ce soit super sécurisé, mais j'aimerais utiliser un algorithme actuellement ininterrompu.
Idéalement, je serais capable de faire quelque chose comme
var gibberish = encrypt(string, salt, key);
pour générer la chaîne encodée, et quelque chose comme
var sensical = decrypt(gibberish, key);
pour le décoder plus tard.
Jusqu'à présent, j'ai vu ceci: http://bitwiseshiftleft.github.io/sjcl/
Y a-t-il d'autres bibliothèques que je devrais consulter?
encryption
javascript
Jérémie
la source
la source
Réponses:
la source
Que diriez-vous CryptoJS ?
C'est une bibliothèque cryptographique solide, avec beaucoup de fonctionnalités. Il implémente des hachages, HMAC, PBKDF2 et des chiffrements. Dans ce cas, vous avez besoin de chiffrements. Consultez le guide de démarrage rapide sur la page d'accueil du projet.
Vous pouvez faire quelque chose comme avec l'AES:
En ce qui concerne la sécurité, au moment de mon écriture, l'algorithme AES est considéré comme ininterrompu
Éditer :
Il semble que l'URL en ligne est en panne et vous pouvez utiliser les fichiers téléchargés pour le cryptage à partir du lien ci-dessous et placer les fichiers respectifs dans votre dossier racine de l'application.
https://code.google.com/archive/p/crypto-js/downloads
ou utilisé un autre CDN comme https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
la source
J'ai créé un utilitaire de chiffrement / déchiffrement de texte non sécurisé mais simple. Aucune dépendance avec une bibliothèque externe.
Ce sont les fonctions
Et vous pouvez les utiliser comme suit:
la source
let
. 😒︎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é.crypto_secretbox()
/crypto_secretbox_open()
offre un chiffrement authentifié par clé partagée.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:
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 APIEncryptedRow
etEncryptedMultiRows
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 ...
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.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.
la source
Les navigateurs modernes prennent désormais en charge l'
crypto.subtle
API, qui fournit des fonctions de cryptage et de décryptage natives (async pas moins!) En utilisant l'une de ces méthodes: AES-CBC, AES-CTR, AES-GCM ou RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
la source
Avant de mettre en œuvre tout cela, veuillez consulter la réponse de Scott Arciszewski .
Je veux que vous soyez très prudent avec ce que je suis sur le point de partager car je n'ai que peu ou pas de connaissances en matière de sécurité (il y a de fortes chances que j'utilise mal l'API ci-dessous), donc je serais plus que bienvenu pour mettre à jour cette réponse avec l'aide de la communauté .
Comme @richardtallent l'a mentionné dans sa réponse , il existe un support pour l'API Web Crypto, donc cet exemple utilise le standard. Au moment d'écrire ces lignes, 95,88% de la prise en charge mondiale des navigateurs .
Je vais partager un exemple en utilisant l'API Web Crypto
Avant de continuer, veuillez noter ( Citations de MDN ):
Je respecte beaucoup la sécurité, et j'ai même mis en gras des parties supplémentaires de MDN ... Vous avez été prévenu
Maintenant, à l'exemple réel ...
JSFiddle:
Trouvé ici: https://jsfiddle.net/superjose/rm4e0gqa/5/
Remarque:
Notez l'utilisation de
await
mots - clés. Utilisez-le dans uneasync
fonction ou utilisez.then()
et.catch()
.Générez la clé:
Crypter:
Décrypter
Conversion de ArrayBuffer d'avant en arrière à partir de String (fait dans TypeScript):
Vous pouvez trouver plus d'exemples ici (je ne suis pas le propriétaire): // https://github.com/diafygi/webcrypto-examples
la source
CryptoJS n'est plus pris en charge. Si vous souhaitez continuer à l'utiliser, vous pouvez passer à cette URL:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
la source
Utilisez SimpleCrypto
Utilisation de encrypt () et decrypt ()
la source
Fonctions simples,
la source