Estoy interesado en crear una pequeña aplicación para uso personal que cifre y descifre información del lado del cliente mediante JavaScript. La información cifrada se almacenará en una base de datos en un servidor, pero nunca la versión descifrada.
No tiene que ser súper seguro, pero me gustaría usar un algoritmo ininterrumpido actualmente.
Lo ideal sería poder hacer algo como
var gibberish = encrypt(string, salt, key);
para generar la cadena codificada, y algo así como
var sensical = decrypt(gibberish, key);
para decodificarlo más tarde.
Hasta ahora he visto esto: http://bitwiseshiftleft.github.io/sjcl/
¿Alguna otra biblioteca que debería mirar?
encryption
javascript
jeremiahs
fuente
fuente
Respuestas:
fuente
¿Qué tal CryptoJS ?
Es una biblioteca criptográfica sólida, con mucha funcionalidad. Implementa hashers, HMAC, PBKDF2 y cifrados. En este caso, las cifras son lo que necesita. Consulte la guía de inicio rápido en la página de inicio del proyecto.
Podrías hacer algo como con el AES:
En cuanto a la seguridad, en el momento en que escribo el algoritmo AES se considera ininterrumpido.
Editar:
Parece que la URL en línea está inactiva y puede usar los archivos descargados para el cifrado desde el siguiente enlace y colocar los archivos respectivos en su carpeta raíz de la aplicación.
https://code.google.com/archive/p/crypto-js/downloads
o usó otro CDN como https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js
fuente
Creé una utilidad de cifrado / descifrado de texto insegura pero simple. Sin dependencias con ninguna biblioteca externa.
Estas son las funciones.
Y puede usarlos de la siguiente manera:
fuente
let
. 😒︎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.crypto_secretbox()
/crypto_secretbox_open()
ofrecer cifrado autenticado de clave compartida.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:
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 APIEncryptedRow
yEncryptedMultiRows
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 ...
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.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.
fuente
Los navegadores modernos ahora admiten la
crypto.subtle
API, que proporciona funciones nativas de cifrado y descifrado (¡asíncrono no menos!) Utilizando uno de estos métodos: AES-CBC, AES-CTR, AES-GCM o RSA-OAEP.https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto
fuente
Antes de implementar algo de esto, vea la respuesta de Scott Arciszewski .
Quiero que tengas mucho cuidado con lo que estoy a punto de compartir, ya que tengo poco o ningún conocimiento de seguridad (hay una gran posibilidad de que esté haciendo un mal uso de la API a continuación), por lo que sería más que bienvenido para actualizar esta respuesta con la ayuda de la comunidad .
Como @richardtallent mencionó en su respuesta , hay soporte para Web Crypto API, por lo que este ejemplo utiliza el estándar. Al momento de escribir este artículo, hay un 95.88% de soporte de navegador global .
Voy a compartir un ejemplo usando la Web Crypto API
Antes de continuar, tenga en cuenta ( Citando de MDN ):
Respeto mucho la seguridad, e incluso agregué piezas adicionales de MDN ... Te han advertido
ahora, para el ejemplo real ...
JSFiddle:
Encontrado aquí: https://jsfiddle.net/superjose/rm4e0gqa/5/
Nota:
Tenga en cuenta el uso de
await
palabras clave. Úselo dentro de unaasync
función o use.then()
y.catch()
.Genera la clave:
Cifrar:
Descifrar
Convertir ArrayBuffer de ida y vuelta desde String (hecho en TypeScript):
Puede encontrar más ejemplos aquí (no soy el propietario): // https://github.com/diafygi/webcrypto-examples
fuente
CryptoJS ya no es compatible. Si desea continuar usándolo, puede cambiar a esta url:
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>
fuente
Use SimpleCrypto
Usando encrypt () y decrypt ()
fuente
Funciones simples,
fuente