Verificación de contraseña con PBKDF2 en Java

Estoy haciendo un 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 póster generoso en este sitio).

 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 ingresa su contraseña en cada extremo y el cifrado y el descifrado funcionan bien 🙂 Mi problema es que me gustaría poder verificar que la contraseña que ingresa el usuario es correcta antes de embarcarme en la (potencialmente larga) proceso de descifrado 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 tu tiempo.

No hay un mecanismo de “comprobación rápida” que sea seguro, por definición. El objective de usar PBKDF2 o técnicas relacionadas es hacer que la verificación de contraseñas sea lenta, para frustrar los progtwigs de descifrado de contraseñas. Si agregaste un sistema de verificación rápida, los crackers de contraseñas podrían adivinar contraseñas a granel muy rápidamente.

Oye, gracias a crazy scot y a Chris por su ayuda. Después de hacer algunas excavaciones, decidí utilizar los métodos descritos en la página de cifrado de archivos del Dr. Gladmans para realizar tanto la verificación de contraseñas como la autenticación de mensajes. Creo que este método, basado en PBKDF2 y MAC, hace que el valor de verificación para m la contraseña sea lo suficientemente caro como para hacerlo seguro. Gracias de nuevo, y espero que esta solución ayude a otros.

Calcule algún tipo de etiqueta de verificación de contraseña y almacénela junto con los datos del archivo encriptado para que pueda verificarlo primero. Esto podría ser algo así como el PBMAC de una cadena fija (corta). Por supuesto, esto tiene que ser una función no reversible, por lo que un cracker no podría determinar la contraseña y no ser demasiado rápido para calcularla para confundir el ataque de fuerza bruta.

¿Ha considerado si (y cómo) detectará si todo el archivo se ha descifrado correctamente? Probablemente deberías buscar alguna combinación de PBES2 y PBMAC en lugar de usar AES directamente.