¿Existe una biblioteca disponible para el cifrado AES de 256 bits en Javascript?
¿Existe una biblioteca disponible para el cifrado AES de 256 bits en Javascript?
Respuestas:
JSAES es una poderosa implementación de AES en JavaScript. http://point-at-infinity.org/jsaes/
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.
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/
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:
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
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
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:
Utilice CryptoJS
Aquí está el código: https://github.com/odedhb/AES-encrypt
Y aquí hay un ejemplo de trabajo en línea: https://odedhb.github.io/AES-encrypt/
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 :)
http://www.movable-type.co.uk/scripts/aes.html biblioteca puede ser de ayuda.
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
También hay una biblioteca gratuita de Stanford como alternativa a Cryptojs
Otra solución con soporte AES-256: https://github.com/digitalbazaar/forge
Aquí está la única solución que funcionó para mí:
http://www.hanewin.net/encrypt/aes/aes.htm
Es bastante básico, pero fácil de usar y parece funcionar bien.