Pregunta

Estoy escribiendo una pequeña aplicación de escritorio que debe ser capaz de cifrar un archivo de datos y protegerlo con una contraseña (es decir,uno debe introducir la contraseña correcta para descifrar).Quiero que el cifrado de datos de archivo a ser autónomo y portátil, por lo que la autenticación ha de ser incorporados en el fichero (o eso supongo).

Tengo una estrategia que parece viable y lógico basado en lo que yo sé (que es, probablemente, sólo lo suficiente como para ser peligroso), pero no tengo idea de si es realmente un buen diseño o no.Así que dime:es este loco?Existe una mejor/mejor manera de hacerlo?

  • Paso 1:Usuario introduce la contraseña en texto plano, por ejemplo,"MyDifficultPassword"
  • Paso 2:Aplicación de los hash de la contraseña de usuario y utiliza el valor de la clave simétrica para cifrar/descifrar el archivo de datos.por ejemplo,"MyDifficultPassword" --> "HashedUserPwdAndKey".
  • Paso 3:Aplicación de hashes el valor hash a partir del paso 2 y guarda el nuevo valor en el encabezado de archivo de datos (es decir,el sin cifrar parte del archivo de datos) y utiliza ese valor para validar la contraseña del usuario.por ejemplo,"HashedUserPwdAndKey" --> "HashedValueForAuthentication"

Básicamente estoy extrapolando a partir de la común manera de implementar el sitio web de contraseñas (cuando no la esté usando OpenID, que es), que consiste en almacenar el (salado) hash de la contraseña del usuario en la bd y no guardar la contraseña real.Pero desde que uso el hash de la contraseña de usuario para la clave de cifrado simétrico, no puedo usar el mismo valor para la autenticación.Así que me hash de nuevo, básicamente el tratamiento es igual que otra contraseña, y guardar el doblemente hash valor en el archivo de datos.De esa manera, puedo pasar el archivo a otro PC y descifrar con sólo introducir mi contraseña.

Así es este diseño razonablemente seguro, o irremediablemente ingenua, o en algún punto intermedio?Gracias!

EDITAR:de clarificación y seguimiento de la pregunta re:Sal.
Pensé que la sal tenía que ser mantenido en secreto, para ser útiles, pero sus respuestas y enlaces implica que este no es el caso.Por ejemplo, esta especificación vinculado por erickson (abajo) dice:

Por lo tanto, basado en contraseña la clave de derivación como se define aquí, es una función de una contraseña, una de sal, y un número de iteraciones, donde los últimos dos cantidades no necesitan mantenerse en secreto.

¿Significa esto que yo podría almacenar el valor de la sal en el mismo lugar/archivo como el hash de la clave y todavía más seguro que si he utilizado nada de sal en absoluto cuando hash?¿Cómo funciona eso?

Un poco más de contexto:el archivo cifrado no está destinada a ser compartida con o descifrados por los demás, es realmente único-datos del usuario.Pero me gustaría implementarlo en un entorno compartido en equipos que no estoy totalmente de control (por ejemplo,en el trabajo) y ser capaces de migrar/mover los datos, simplemente copiar el archivo (por lo que puede utilizar en casa, en las diferentes estaciones de trabajo, etc.).

¿Fue útil?

Solución

La Generación De Claves

Me gustaría recomendar el uso de un reconocido algoritmo como PBKDF2 definido en PKCS #5 versión 2.0 para generar una clave de su contraseña.Es similar al algoritmo de resumen, pero es capaz de generar más claves simétricas para su uso con AES.Usted debe ser capaz de encontrar una fuente abierta de la biblioteca que implementa la PBE generadores de claves para los diferentes algoritmos.

Formato De Archivo

Usted también podría considerar el uso de la Sintaxis De Cifrado De Mensajes como un formato para el archivo.Esto requiere de algunas estudiar por su parte, pero de nuevo hay bibliotecas existentes a utilizar, y se abre la posibilidad de inter-operativo más sin problemas con otros programas, como el S/MIME habilitado para los clientes de correo.

La Validación De La Contraseña

Con respecto a su deseo de almacenar un hash de la contraseña, si utiliza PBKDF2 para generar la clave, se puede utilizar un algoritmo de hash de contraseña estándar (gran sal, mil rondas de la mezcla) para que, y obtener valores diferentes.

Alternativamente, se podría calcular un MAC en el contenido.Una colisión de hash de una contraseña es más probable que sea útil para un atacante;una colisión de hash sobre el contenido probablemente será inútil.Pero serviría para dejar un legítimo destinatario sepa que la contraseña incorrecta se utiliza para el descifrado.

De Cifrado De Sal

Sal ayuda a frustrar pre-calculadas ataques de diccionario.

Supongamos que un atacante tiene una lista de posibles contraseñas.Él puede hash de cada uno y comparar con el hash de su víctima contraseña, y ver si coincide.Si la lista es grande, esto podría tomar un tiempo largo.Él no quiere pasar mucho tiempo en su próximo objetivo, así que graba el resultado en un "diccionario" donde un hash puntos a su entrada correspondiente.Si la lista de contraseñas es muy, muy largo, puede utilizar técnicas como la de un Rainbow Table para ahorrar algo de espacio.

Sin embargo, supongamos que su próximo objetivo salado de su contraseña. Incluso si el atacante sabe lo que la sal es, su precalculadas tabla no vale nada—la sal cambia el hash resultante de cada contraseña.Él tiene que volver a todos los hash de las contraseñas que en su lista, fijando el objetivo del sal a la entrada.Cada uno de los diferentes sal exige un diccionario, y si una cantidad suficiente de sales se utilizan, el atacante no tiene espacio para almacenar los diccionarios para todos ellos.El comercio de espacio para guardar el tiempo ya no es una opción;el atacante debe retroceder para hash de cada contraseña en su lista para cada destino quiere atacar.

Así, no es necesario para mantener la sal en secreto.Asegurar que el atacante no tiene un pre-calculadas diccionario correspondiente a esa sal es suficiente.

Otros consejos

Como Niyaz dijo, el enfoque parece razonable si utiliza una aplicación de la calidad de fuertes algoritmos, como SHA-265 y AES de hashing y de cifrado.Además me gustaría recomendar el uso de Sal para reducir la posibilidad de crear un diccionario de todos los hash de las contraseñas.

Por supuesto, la lectura de Bruce Schneier's Criptografía Aplicada nunca está mal tampoco.

Si usted está usando un fuerte algoritmo de hash (SHA-2) y un fuerte algoritmo de Cifrado (AES), que va a hacer bien con este enfoque.

¿Por qué no utilizar una biblioteca de compresión que soporta archivos protegidos por contraseña?He utilizado una contraseña protegida archivo zip que contiene el contenido XML en el pasado :}

Es realmente necesario guardar el hash de la contraseña en el archivo.No puede usted sólo tiene que utilizar la clave de acceso (o contraseña con algoritmo hash) con un poco de sal y, a continuación, cifrar el archivo con ella.Cuando descifrar sólo tratar de descifrar el archivo con la contraseña + sal.Si el usuario da contraseña incorrecta del archivo descifrado no es correcta.

Sólo inconvenientes que puedo pensar es que si el usuario introduce accidentalmente contraseña incorrecta y el descifrado es lento, tiene que esperar para volver a intentarlo.Y por supuesto, si se olvida la contraseña, no hay manera de descifrar el archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top