Cifrado AES de JavaScript [cerrado]

109

¿Existe una biblioteca disponible para el cifrado AES de 256 bits en Javascript?

descifrador
fuente
Esto es lo que necesita para el cifrado AES usando crypto-js <script src = " cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/… > <script> var encryptedAES = CryptoJS.AES.encrypt ("Mensaje", "Frase de contraseña"); var decrypted = CryptoJS.AES.decrypt (encryptedAES.toString (), "Passphrase"); console.log ("Encrypted:", encryptedAES.toString ()); console.log ( "Decrypted:", decrypted.toString (CryptoJS.enc.Utf8)); </script>
Hari Das

Respuestas:

66

JSAES es una poderosa implementación de AES en JavaScript. http://point-at-infinity.org/jsaes/

barra invertida17
fuente
32
JSAES tiene licencia GNU GPL, por lo que no se puede utilizar para algunos proyectos.
Robert
11
Esto ahora es bastante útil y rico en funciones code.google.com/p/crypto-js
David Kierans
2
@HappyDeveloper Bueno, no. No culpe a la licencia por esto. El autor ha elegido la licencia incorrecta, ya que GPL no es adecuada para bibliotecas.
inta
4
Su uso es "gratuito", pero no puede usarlo si desea publicar el producto resultante bajo algo que no sea la GPL.
Curtis
3
JSAES es un buen punto de partida, pero solo se puede utilizar para cifrar 16 bytes de datos. Si desea cifrar un bloque de datos más grande, debe ampliarlo usted mismo para implementar el vector de inicialización, el modo de cifrado (CBC u otro ...), el relleno.
Paolo
35

Aquí hay una página de demostración que usa slowAES.

slowAES fue fácil de usar. Diseñado lógicamente. Embalaje OO razonable. Admite perillas y palancas como IV y modo de cifrado. Buena compatibilidad con .NET / C #. El nombre es irónico; se llama " AES lento " porque no está implementado en C ++. Pero en mis pruebas no fue demasiado lento.

Carece de modo ECB. También carece de un modo CTR, aunque supongo que podría construir uno con bastante facilidad dado un modo ECB.

Se centra únicamente en el cifrado. Una buena clase complementaria que realiza la derivación de claves basada en contraseñas que cumple con RFC2898 , en Javascript, está disponible en Anandam . Este par de bibliotecas funciona bien con las clases .NET análogas. Buena interoperabilidad. Sin embargo, a diferencia de SlowAES, Javascript PBKDF2 es notablemente más lento que la clase Rfc2898DeriveBytes al generar claves.

No es de extrañar que técnicamente haya buena interoperabilidad, pero el punto clave para mí fue que el modelo adoptado por SlowAES es familiar y fácil de usar. Encontré que algunas de las otras bibliotecas de Javascript para AES son difíciles de entender y usar. Por ejemplo, en algunos de ellos no pude encontrar el lugar para configurar el IV, o el modo (CBC, ECB, etc.). Las cosas no estaban donde esperaba que estuvieran. SlowAES no era así. Las propiedades estaban justo donde esperaba que estuvieran. Fue fácil para mí aprender, ya que estaba familiarizado con los modelos de programación criptográfica de Java y .NET.

El PBKDF2 de Anandam no estaba a ese nivel. Admitía solo una llamada a la función DeriveBytes, por lo que si necesita derivar una clave y un IV a partir de una contraseña, esta biblioteca no funcionará sin cambios. Alguna pequeña modificación, y está funcionando bien para ese propósito.

EDITAR : Monté un ejemplo de envases SlowAES y una versión modificada de la Anandam PBKDF2 en componentes de secuencias de comandos de Windows. El uso de este AES con una clave derivada de contraseña muestra una buena interoperabilidad con la clase .NET RijndaelManaged.

EDIT2 : la página de demostración muestra cómo utilizar este cifrado AES desde una página web. El uso de las mismas entradas (iv, clave, modo, etc.) admitidas en .NET le brinda una buena interoperabilidad con la clase .NET Rijndael. Puede hacer una "fuente de vista" para obtener el javascript para esa página.

EDIT3
una adición tardía: la criptografía de JavaScript se considera dañina. Vale la pena leerlo.

Cheeso
fuente
1
Veo un caso de uso válido: la aplicación HTML 5 en la que todos los archivos se almacenan localmente. Si los archivos locales pueden ser secuestrados, entonces estás condenado en cualquier caso ;-).
Nux
8
sobre el enlace edit3, es una mierda de artículo ... ¡la mitad de sus afirmaciones son completamente falsas!
mmm
2
El problema de la clave aleatoria se puede solucionar haciendo que el usuario mueva el mouse e ingrese las teclas como un verdadero generador aleatorio.
mmm
2
El enlace a la página de demostración parece estar roto.
Sean
26

En mis búsquedas de cifrado AES encontré esto de algunos estudiantes de Standford. Afirma ser el más rápido que existe. Admite cifrado CCM, OCB, GCM y Block. http://crypto.stanford.edu/sjcl/

Danny C
fuente
¡Eso es de lo que estoy hablando!
mmm
5
Falta documentación y es difícil de usar. ¿Cómo se cambia la longitud de la clave? Busqué alrededor de los documentos y no pude averiguarlo en un tiempo razonable. Además, cuando encripta algo, se devuelve una matriz de pares clave-valor, pero los documentos no parecen explicarlos. Terminé usando la biblioteca de tipos móviles.
CpnCrunch
Y esto no es asincrónico, por lo que si está encriptando o desencriptando una cadena más larga, por ejemplo con AES-CBC, entonces bloquea la interfaz de usuario
rsz
12

Al buscar en Google "JavaScript AES" se han encontrado varios ejemplos. El primero que apareció está diseñado para explicar el algoritmo y proporcionar una solución:

Secuencias de comandos de tipo móvil: AES

Samir Talwar
fuente
1
No pude averiguar cómo configurar el IV en esa biblioteca. Además, no es muy OO.
Cheeso
El equivalente del IV en modo contador es el nonce. Esta implementación ha sido reformulada para ser más orientada a objetos. Solo incluye el modo de operación de contador (CTR).
ChrisV
Esto funciona bastante bien, excepto que no tiene ningún modo ECB.
CpnCrunch
10

Esta publicación ahora es antigua, pero el crypto-js puede ser ahora la biblioteca de cifrado de JavaScript más completa.

CryptoJS es una colección de algoritmos criptográficos implementados en JavaScript. Incluye los siguientes cifrados: AES-128, AES-192, AES-256, DES, Triple DES, Rabbit, RC4, RC4Drop y hashers: MD5, RIPEMD-160, SHA-1, SHA-256, SHA-512, SHA -3 con 224, 256, 384 o 512 bits.

Es posible que desee consultar su Guía de inicio rápido, que también es la referencia para el siguiente puerto de node.js.

node-cryptojs-aes es un puerto de node.js de crypto-js

Marcz
fuente
1
Desafortunadamente, falta la documentación. Solo parece tener una guía de "inicio rápido". ¿Dónde está la documentación completa? Dice que admite múltiples longitudes de clave, pero no hay documentación sobre cómo hacerlo.
CpnCrunch
@CpnCrunch: el documento completo de la API no está en línea, pero el código como comentarios completos de la API de javadoc. Y puedes generarlo. Lea los comentarios en la fuente cipher-core.js y encontrará el tamaño de la clave de cifrado y el tamaño de IV del cifrado.
marcz
raro, cuando
cifro
Hay algunos conflictos debido al uso de openssl
Vlad
9

Recientemente tuve la necesidad de realizar alguna interoperabilidad de cifrado / descifrado entre javascript y python.

Específicamente...

1) Usar AES para cifrar en javascript y descifrar en python (Google App Engine) 2) Usar RSA para cifrar en javascript y descifrar en python (Google App Engine) 3) Usar pycrypto

Encontré muchas versiones diferentes de RSA y AES flotando en la web y todas eran diferentes en su enfoque, pero no encontré un buen ejemplo de interoperabilidad de extremo a extremo de javascript y python.

Finalmente, logré improvisar algo que se adaptara a mis necesidades después de mucho ensayo y error.

De todos modos, puse un ejemplo de un js / webapp hablando con un servidor de Python alojado en un motor de aplicaciones de Google que usa AES y clave pública y clave privada RSA.

Pensé que lo incluiría aquí por enlace en caso de que sea de alguna utilidad para otros que necesiten lograr lo mismo.

http://www.ipowow.com/files/aesrsademo.tar.gz

y vea la demostración en rsa-aes-demo DOT appspot DOT com

editar: mire la salida de la consola del navegador y también vea la fuente para obtener algunas sugerencias y mensajes útiles sobre lo que está sucediendo en la demostración

editar: actualizado enlace muy antiguo y difunto a la fuente para que ahora apunte a

https://sestertii.com/files/aesrsademo.tar.gz

David Kierans
fuente
1
¡Muchas gracias por esto! Por mi vida, no pude hacer que mis aes de JavaScript hablen con mis aes de python.
Spike
1
He intentado toda la noche (con pycrypto y otros) hacer lo que su código me ayudó a lograr en 10 minutos. ¡Muchas gracias!
Remy Vanherweghem
1
Por alguna razón conseguí que RSA funcionara fácilmente, pero AES es un verdadero dolor de cabeza. ¡¡¡Gracias por esto!!!
Avión de velocidad
1
el enlace ... no se encuentra!
machineaddict
7

A juzgar por mi propia experiencia, asmcrypto.js proporciona la implementación AES más rápida en JavaScript (especialmente en Firefox, ya que puede aprovechar completamente asm.js allí).

Desde el archivo Léame:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

Editar: La API de criptografía web ahora está implementada en la mayoría de los navegadores y debe usarse como la solución principal si le importa el rendimiento. Tenga en cuenta que IE11 implementó una versión preliminar anterior del estándar que no usaba promesas.

Aquí se pueden encontrar algunos ejemplos:

Joel Richard
fuente
Estoy obteniendo alrededor de 8 MiB / s con CryptoJS. Me pregunto cómo funcionaría esto.
Lodewijk
3

Prueba asmcrypto.js , es realmente rápido.

PD: Soy autor y puedo responder a sus preguntas si las hay. También me alegraría recibir comentarios :)

vibornoff
fuente
asmcrypto.js es bueno, pero en IE10 no funciona bien. a veces cuelga el navegador durante más de 1 minuto, o al menos 45 segundos. Además, no lo entendí, ¿por qué necesitas reemplazar la función matemática global? hay muchas bibliotecas que usan este.
decho
2
¿Podrías comentar cómo estás seguro de que funciona correctamente? IOW: ¿Cómo sabe que implementó AES correctamente?
Lodewijk
El rendimiento de IE10 es deficiente debido a que no optimiza asm.js en absoluto. También tiene patrones JIT un poco diferentes. Hacer que el código funcione bien en IE también hace que sea una mierda en Chrome y FF. Supongamos que tengo la elección correcta. Respecto a Math.random hubo una larga discusión . En pocas palabras, esta necesidad de prevenir la fuga de salida aleatoria de Math.random sin procesar (que en teoría puede degradar la seguridad de PRNG).
vibornoff
1

Si está intentando utilizar javascript para evitar el uso de SSL, piénselo de nuevo. Hay muchas medidas intermedias, pero solo SSL proporciona una comunicación segura. Las bibliotecas de cifrado de Javascript pueden ayudar contra un determinado conjunto de ataques, pero no contra un verdadero ataque de intermediario.

Si está buscando SSL para el motor de aplicaciones de Google en un dominio personalizado, eche un vistazo a wwwizer.com .

La siguiente publicación explica cómo crear un intento de comunicación segura con javascript y cómo hacerlo mal: Use el módulo de cifrado de JavaScript en lugar de SSL / HTTPS

avión de velocidad
fuente
1
No estoy seguro de por qué esto fue rechazado hasta el olvido, ya que es un muy buen punto que cualquiera que esté pensando en implementar el cifrado de JavaScript debe al menos considerarlo. Voto a favor.
Jules
El uso de criptografía del lado del cliente para evitar SSL es un punto antiguo que algunas personas dicen que va en contra: de hecho, puede agregar seguridad a HTTPS, evitando ataques pasivos o ser utilizado en aplicaciones descargadas y extensiones de navegador. Solo vi una vez que se usaba mal (mi universidad, pero ya lo arreglaron) y muchas veces se usaba correctamente (cryptocat, por ejemplo).
Gustavo Rodrigues