Estoy haciendo el cifrado de archivos basado en contraseñas en Java; Estoy usando AES como el algoritmo de cifrado subyacente y PBKDF2WithHmacSHA1
para derivar una clave de una combinación de sal y contraseña usando el siguiente código (que obtuve de otro cartel generoso en este sitio).Verificación de contraseña con PBKDF2 en Java
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec ks = new PBEKeySpec(password,salt,1024,128);
SecretKey s = f.generateSecret(ks);
Key k = new SecretKeySpec(s.getEncoded(),"AES");
comparto la sal, el usuario introduce su contraseña en cada extremo y el cifrado y descifrado funcionan bien :-) Mi problema es que me gustaría ser capaz de verificar que la contraseña que el usuario ingresa es correcta antes embarcarse en el proceso de descifrado (potencialmente largo). Sé que la especificación PBKD incluye un valor de verificación de 2 bytes opcional, pero no estoy seguro de cómo generar este valor utilizando el enfoque anterior. ¿Ofrece Java soporte para esto o, en caso negativo, cuál sería una alternativa segura?
Gracias por su tiempo.
Hola, gracias por su respuesta. Tenía la impresión de que el propósito de PBKDF2 y su combinación repetida de sal y contraseña para derivar la clave era hacer que el proceso de cálculo de la clave de la contraseña de texto plano fuera caro y, por lo tanto, dificultar los ataques estilo diccionario. Como dije, la especificación PBKDF2 incluye un valor de verificación de contraseña opcional, simplemente no sé cómo llegar a ella en la implementación de Java. – PinkyNoBrain
Acepto que permitir una verificación rápida después de completar el proceso de derivación de claves hace que sea más fácil atacar a la fuerza bruta ya que el atacante no necesita descifrar nada para verificar su clave, pero habría pensado que el gran espacio de búsqueda de las claves AES de 256 bits hace que un ataque de fuerza bruta pura sea prohibitivo de todos modos? – PinkyNoBrain
@pinkynobrain: El problema con la comprobación rápida es que reduce mucho el espacio clave: tiene una forma rápida de descubrir todas las contraseñas para las que se realiza la verificación rápida. Por lo tanto, tiene muchas menos claves para forzar la fuerza bruta del AES. –