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 . EncryptedField
es suficiente para la mayoría de los casos de uso, pero las API EncryptedRow
y EncryptedMultiRows
pueden 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
/ float
encripta 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.js
de 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.