Las respuestas existentes que aprovechan SJCL, CryptoJS y / o WebCrypto no son necesariamente incorrectas, pero no son tan seguras como podría sospechar inicialmente. Generalmente desea usar libsodium . Primero explicaré por qué, luego cómo.
¿Por qué no SJCL, CryptoJS, WebCrypto, etc.?
Respuesta corta: para que su cifrado sea realmente seguro, estas bibliotecas esperan que tome demasiadas opciones, por ejemplo, el modo de cifrado de bloque (CBC, CTR, GCM; si no puede determinar cuál de los tres que acabo de enumerar es seguro uso y bajo qué restricciones, no debería estar abrumado con este tipo de elección en absoluto ).
A menos que su título de trabajo sea ingeniero de criptografía , las probabilidades están en contra de que lo implemente de manera segura.
¿Por qué evitar CryptoJS?
CryptoJS ofrece un puñado de bloques de construcción y espera que sepa cómo usarlos de forma segura. Incluso por defecto es el modo CBC ( archivado ).
¿Por qué es malo el modo CBC?
Lea este artículo sobre vulnerabilidades AES-CBC .
¿Por qué evitar WebCrypto?
WebCrypto es un estándar potluck, diseñado por un comité, para fines ortogonales a la ingeniería de criptografía. Específicamente, WebCrypto estaba destinado a reemplazar Flash, no a proporcionar seguridad .
¿Por qué evitar SJCL?
La API pública y la documentación de SJCL ruegan a los usuarios que cifren los datos con una contraseña recordada por humanos. Esto es raramente, si alguna vez, lo que quieres hacer en el mundo real.
Además: Su conteo de rondas PBKDF2 predeterminado es aproximadamente 86 veces más pequeño de lo que desea que sea . AES-128-CCM probablemente esté bien.
De las tres opciones anteriores, SJCL es la menos propensa a terminar en lágrimas. Pero hay mejores opciones disponibles.
¿Por qué es mejor Libsodium?
No necesita elegir entre un menú de modos de cifrado, funciones hash y otras opciones innecesarias. Nunca se arriesgará a arruinar sus parámetros y eliminar toda la seguridad de su protocolo .
En cambio, libsodium solo le brinda opciones simples ajustadas para máxima seguridad y API minimalistas.
crypto_box()/ crypto_box_open()ofrecer cifrado de clave pública autenticado.
- El algoritmo en cuestión combina X25519 (ECDH sobre Curve25519) y XSalsa20-Poly1305, pero no necesita saber (ni siquiera preocuparse) sobre eso para usarlo de forma segura
crypto_secretbox()/ crypto_secretbox_open()ofrecer cifrado autenticado de clave compartida.
- El algoritmo en cuestión es XSalsa20-Poly1305, pero no necesita saberlo / cuidarlo
Además, libsodium tiene enlaces en docenas de lenguajes de programación populares , por lo que es muy probable que libsodium solo funcione cuando intente interactuar con otra pila de programación. Además, libsodium tiende a ser muy rápido sin sacrificar la seguridad.
¿Cómo usar Libsodium en JavaScript?
Primero, debes decidir una cosa:
- ¿Solo desea cifrar / descifrar datos (y tal vez de alguna manera utilizar el texto sin formato en las consultas de la base de datos de forma segura) y no preocuparse por los detalles? O...
- ¿Necesita implementar un protocolo específico?
Si seleccionó la primera opción , obtenga CipherSweet.js .
La documentación está disponible en línea . EncryptedFieldes suficiente para la mayoría de los casos de uso, pero las API EncryptedRowy EncryptedMultiRowspueden ser más fáciles si tiene muchos campos distintos que desea cifrar.
Con CipherSweet, ni siquiera necesita saber qué es un nonce / IV para usarlo de forma segura.
Además, esto maneja int/ floatencripta sin filtrar datos sobre el contenido a través del tamaño del texto cifrado.
De lo contrario, querrá sodio plus , que es una interfaz fácil de usar para varios envoltorios de libsodio. Sodium-Plus le permite escribir código multiplataforma asíncrono y de rendimiento que sea fácil de auditar y razonar.
Para instalar sodium-plus, simplemente ejecute ...
npm install sodium-plus
Actualmente no hay una CDN pública para el soporte del navegador. Esto cambiará pronto. Sin embargo, se puede agarrar sodium-plus.min.jsde la última versión de Github si lo necesita.
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 documentación para sodio plus está disponible en Github.
Si desea un tutorial paso a paso, este artículo dev.to tiene lo que está buscando.