Generar clave para cifrado con AES

Hola a todos quisiera que me ayudaran en la forma correcta de cifrar con AES en java.

actualmente estoy obteniendo la instancia del chyper asi

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

tengo entendido que CBC es muy seguro y con padding no tendré problemas con si los bytes a cifrar no son múltiplos de 128

la duda que tengo es respecto a la contraseña estoy usando cadenas de 128 bits osea 16 bytes ademas necesito otros 16 bytes para el vetor de inicializacion, para conseguir estos 32 bytes hago lo siguiente:

calculo la suma MD5 de la contraseña brinda por el usuario, esto me da un hash de 32 bytes y luego divido el hash por la mitad y asi consigo la contraseña para cifrado y el IV.

Creen que esta forma de cifrar es segura y sino cual seria la forma correcta de hacerlo

Muchas gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

32?

No, un MD5 te da un hash de 16 bytes. Si lo codificas como una cadena hexadecimal tendrás 32 caracteres, pero cuando estás cifrando datos debes lidiar con bytes directamente. MD5 te da 16 bytes (128 bits).

Lo que estás haciendo es usar una llave que realmente es de 64 bits y un vector de inicialización también de 64 bits (porque son las dos mitades del MD5). Aunque tu llave mida 16 bytes, es una codificación hexadecimal que representa solamente 8 bytes. Y además, estás usando un solo dato como llave: la contraseña del usuario. No estás insertando ningún elemento aleatorio. De modo que si cifras bloques de datos muy similares con la misma contraseña, los datos cifrados serán similares (aunque uses CBC o CFB; considera que si estás cifrando por ejemplo datos en XML, los primeros bloques no cambian, y eso hace que CBC no sirva para esos bloques iniciales, se detecta un patrón rápidamente al ver que todos los datos cifrados son similares al inicio).

La forma correcta de hacerlo es que leas el estándar PKCS #5, PBE (Password-Based Encryption) versión 2.

Muchas gracias Y si...

Gracias por tu respuesta y si solo uso MD5 para generar la contraseña y para Vector de inicializacion genero una secuencia de 16 bytes con Random y este IV es almacenado junto con los datos cifrados

Imagen de ezamudio

PKCS5

Lee el estándar. Es mucho más seguro que lo estás proponiendo. Una bola de matemáticos dedicaron bastante tiempo a diseñar ese estándar, analizarlo y probarlo hasta el cansancio; de verdad crees que vas a inventarte algo mejor en dos patadas?

Al final, vas a hacer lo que tú quieras. Pero viniste a preguntar al foro, y la respuesta es: Implementa PKCS5 v2. Esta última propuesta tuya ya medio se acerca al estándar, por lo que no entiendo entonces por qué no de una vez ya implementarlo bien, en vez de dejar algo que parece que está bien pero tiene debilidades. Para qué implementar la ilusión de seguridad si puedes implementar seguridad real.

Tienes razon

Gracias por tu respuesta y realmente tienes razón es mejor hacer las cosas bien desde el principio y no lamentarme después por fugas de información

Imagen de seba23571

me gustaria saber como cifrar datos de una tabla entera

tal ves alguien tenga una experiencia..real... lo que quiero hacer en la empresa donde trabajo es cifrar toda una tabla entera en myql para mi porteccion personal

Imagen de ezamudio

uso personal?

Quieres cifrar una tabla entera para tu protección personal? O sea que solamente tú puedas leer los datos que metiste ahí?

Entonces puedes usar un algoritmo simétrico como AES.

Si lo que necesitas realmente es cifrar datos para que no los pueda leer alguien que entra a la base de datos con pocos privilegios, pero que los pueda descifrar una aplicación, es otro problema completamente distinto.

Si necesitas cifrar los datos de usuarios de modo que solamente cada usuario pueda descifrar sus propios datos, es otro problema completamente distinto.

Si quieres cifrar passwords, ese es otro problema completamente distinto.