2010-03-03 24 views
16

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.

Respuesta

4

Hola, gracias a crazy scot y Chris por su ayuda. Después de hacer algunas excavaciones, decidí utilizar los métodos descritos en Dr Gladmans file encryption page para hacer la verificación de contraseña y 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.

5

No hay un mecanismo de "comprobación rápida" que sea seguro, por definición. El objetivo de usar PBKDF2 o técnicas relacionadas es hacer que la verificación de contraseñas sea lenta, para frustrar los programas 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.

+0

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

+0

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

+0

@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. –

2

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.

+0

Hola, gracias por su rápida respuesta y su consejo sobre PBES2 y PMAC, sin duda lo investigaré. Pensé en usar el enfoque de cadena fija, pero me preocupaba que se abriera el proceso a ataques conocidos de texto plano. En su lugar, pensé en usar un hash seguro de la clave en sí, si la función hash es realmente no invertable, esto no proporcionaría información sobre la clave en sí, pero me permitiría comprobar que las claves son las mismas. ¿Qué crees que es un buen enfoque? – PinkyNoBrain

+0

Es cierto que algún tipo de verificación necesariamente hace un tipo de texto claro conocido. Sin embargo, el uso de las funciones PB * hace que la función de trabajo sea más difícil, multiplicándola efectivamente por su conteo de iteraciones en comparación con un hash simple e ingenuo. – crazyscot

Cuestiones relacionadas