/ / ¿Utilizando blowfish en modo CBC para el cifrado y descifrado pero cómo proceder con la IV? - java, cifrado, criptografía

¿Utilizando blowfish en modo CBC para el cifrado y descifrado pero cómo proceder con la IV? - Java, cifrado, criptografía.

Tengo una interfaz de usuario para agregar / editar la contraseña. Estas contraseñas están cifradas usando Blowfish en modo CBC y funcionó bien, pero durante el descifrado se requirió una IV (arrojó una excepción de falta de parámetros).

He utilizado la clase de cifrado al iniciar el cifrado, por lo que esto habría solucionado la IV al cifrar.

Así que mi duda es,

  1. debe ser el IV tanto para el cifrado ydescifrado? Leí en algunas páginas que, si bien desciframos si usamos un IV incorrecto, el primer bloque será incorrecto, pero los bloques restantes serían correctos. ¿Puede explicar esto?

  2. ¿Si la IV (en caso de cifrado y descifrado con el mismo IV) se guarda, se debe guardar como un objeto simple o cifrar junto con la contraseña con algún delimitador? ¿Cuál será más seguro?

Gracias por adelantado.

Respuestas

2 para la respuesta № 1
  1. Sí, el IV debe ser el mismo para el cifrado / descifrado. En CBC, si recuerdo bien, los errores caerán en cascada hacia los bloques. Entonces, todo el mensaje será incorrecto si usas el IV incorrecto.
  2. La IV se puede almacenar en texto plano. Si intentas almacenarlo encriptado, terminarás necesitando almacenar el IV utilizado para cifrar el IV ...

Sin embargo, generalmente se considera una mala práctica almacenar las contraseñas en forma cifrada. Si alguien fuera a recuperar su base de datos, solo tendría que encontrar una clave para recuperar todas las contraseñas.

La forma recomendada de almacenar contraseñas es usaruna función hash varias veces, también conocida como PBKDF (función de derivación de clave basada en contraseña), ya sea basada en un hash simple o en una función hmac. Ver el Chipsheet de almacenamiento de contraseña OWASP.

Hay primitivas para esto en java, ver el ejemplo en esta pagina. (Busque Use un algoritmo de hash de contraseña y desplácese hacia abajo hasta la implementación de java).