2011-12-18 28 views
9

Estoy buscando un algoritmo seguro de encriptación de clave simétrica compatible con JavaScript y Java.Algoritmo de cifrado de clave simétrica

He intentado implementar uno pero tuve algunos problemas de codificación.

+2

¿Qué quiere decir con "compatible"? – hellectronic

+0

Así puedo cifrar con JavaScript y descifrar con Java y viceversa sin problemas de codificación. –

+2

Me gustaría recomendarle que lea [El mínimo absoluto de cada desarrollador de software Absolutamente, definitivamente debe saber sobre Unicode y conjuntos de caracteres (Sin excusas!)] (Http://www.joelonsoftware.com/articles/Unicode.html) – hellectronic

Respuesta

32

No desea encriptar con JavaScript, especially on the client-side where it is open to tampering, y no tiene cryptographically secure random number generator.

He intentado implementar uno pero tuve algunos problemas de codificación.

¿Intentó escribir su propio algoritmo de cifrado? Has ido contra todo lo que el mundo de la seguridad es querido. tutoriales reales No. que explican cómo funciona la encriptación tienen tanto miedo de que la gente va a enredar las cosas porque no entienden las matemáticas detrás de él, en realidad, he visto esto en uno de ellos:

enter image description here

Si no comprende el cifrado, cosas como, qué es "generador de números pseudoaleatorios seguro criptográficamente" en realidad, y ataques comunes sobre él, no debería hacer eso.

Si no entiende cosas como ataques de canal lateral, no debería hacerlo.

Si no entiende lo que está sucediendo en crypto y ha leído al menos dos libros, no tiene ningún negocio para implementarlo.

Crypto no es una caja negra mágica, es algo MUY fácil de estropear, incluso sin tocar ningún código en una solución empaquetada.

¿Qué debería que hacer? Olvídate del encriptado JS. Lo sé, lo he intentado yo mismo. Es una pérdida de tiempo. Aprende de mis errores

Obtenga un certificado SSL, SSL es la mejor manera de encriptar mensajes en el nivel de transporte de un servidor a un cliente. Es lo más seguro que puede obtener. Si te enfrentas a un advesadero que puede vencer a SSL, créeme, tu cifrado basado en JS también se verá comprometido.

Una vez que esté en el servidor, donde es seguro que no se manipule, cifre. Cualquier otra cosa es una forma realmente larga de perder el tiempo.

También, ve a leer estos libros:

This one is free This one is cash money

A continuación, cuando se comprende que regresen y me gritan por qué estoy equivocado y no entienden cuánto necesita JS en el cliente para hacer crypto.

3

Existe una excelente implementación de DES (y por extensión, 3DES) en JS, que uso con bastante frecuencia. Pondré el enlace el lunes cuando esté en la oficina y lo tenga listo. Los resultados de esto (después de la codificación base64 para el transporte) funcionan perfectamente con .Net/Mono (integrado), Java (bulitin) y PHP (mcrypt).

Encontrados los enlaces, pero ambos están muertos: http://www.shopable.co.uk/des.html y http://www.netdealing.com. Lo he puesto en http://pastebin.com/KbRsWKJY

+1

Mhh en la universidad me enseñaron que DES ahora es fácilmente decriptable ... AES debería estar bien, pero no creo que javascript pueda manejar tal cosa. –

+2

DES es fácilmente descifrable debido a los ataques de fuerza bruta, pero DESede no es fácilmente descifrable. AES es una implementación * más rápida * que DESede, por lo que si JavaScript puede manejar DESede, ciertamente puede manejar AES-128. Use DESede solo para implementaciones heredadas (o, si no puede encontrar otra biblioteca y entienda las pocas debilidades como el tamaño de bloque pequeño, las teclas débiles, los bits de paridad en las claves, etc.). –

+1

Permítanme aclarar: Señalar el Código JS no significa que abrace el uso no reflejado de (3) DES en el lado del cliente sin crítica alguna. Pero considero un hecho, que el uso de la criptografía JS puede ser una capa significativa en defense.in-depth. Así que lo uso, donde creo que tiene sentido. –

1

This page tiene el modo CTR, que está disponible en Java. Recomendaría claves de 128 bits o podría tener problemas con las políticas de exportación de Java en tamaños de clave más grandes.

Here es una página que utiliza algunos de los métodos de cifrado muy útil, incluyendo las técnicas de cifrado de contraseñas y ciphres con las comprobaciones de integridad y autenticación, aunque es posible que tenga las bibliotecas castillo hinchable en Java para que coincidan con los de todo.

Hay montones de bibliotecas para JavaScript, pero los problemas de codificación de caracteres estarán presentes en cualquiera de ellos. Así que asegúrese de utilizar la misma codificación tanto en el lado de JavaScript como en el lado de Java. Una búsqueda rápida me asegura que JavaScript usa UTF-16 internamente, pero no me cuelguen de eso.

Por último, no intente esto en casa, las bibliotecas están allí, úselas (especialmente si mencionan pruebas y/o vectores de prueba oficiales).

+0

¿Dónde puedo encontrar la implementación Java de AES que usa Bouncy Caste? –

+0

Las bibliotecas de Bouncy Castle implementan un proveedor de JCE/JCA. Entonces, la mayor parte de la funcionalidad se agrega a la API crypto de Java. Puede acceder a la implementación hinchable usando, p. Ej. Cipher.getInstance ("algo/mode/padding", "BC"); pero solo * después * ha agregado el proveedor a la clase de Seguridad. También puede acceder directamente a la implementación BC de nivel inferior de las funciones de seguridad directamente. –

+0

¿Hay dos ejemplos compatibles? JavaScript: http://www.movable-type.co.uk/scripts/aes.html; Java: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html –

0

Al igual que las otras respuestas, si no tiene que encriptar con JavaScript, evítelo. Sin embargo, hay algunos casos de uso válidos para encriptar en JavaScript.

Cuando lo necesite, le recomiendo esta biblioteca: https://keybase.io/triplesec/.

Es más seguro que DES, al que se vincula otra respuesta.

Cuestiones relacionadas