2009-10-01 20 views
5

Estoy escribiendo un programa simple para el cifrado de archivos. Principalmente como un ejercicio académico, pero posiblemente para un futuro uso serio. Todo el trabajo pesado se realiza con bibliotecas de terceros, pero armar las piezas de una manera segura sigue siendo todo un desafío para el que no es criptógrafo. Básicamente, tengo casi todo funcionando como creo que debería.¿Usar MD5 para generar una clave de encriptación a partir de una contraseña?

Estoy usando AES de 128 bits para el cifrado con una longitud de clave de 128 bits. Quiero que los usuarios puedan ingresar contraseñas de longitud variable, así que decidí usar la contraseña con MD5 y luego usar el hash como clave. Pensé que esto era aceptable: se supone que la clave siempre es un secreto, por lo que no hay motivo para preocuparse por los ataques de colisión.

Ahora que lo he implementado, me encontré con un par de artículos que indican que esta es una mala idea. Mi pregunta es: ¿por qué? Si se elige una buena contraseña, se supone que el cifrador es lo suficientemente fuerte como para no revelar la clave, excepto a través de un extraordinario esfuerzo de fuerza bruta (es decir, no factible), ¿no? ¿Debo usar algo como PBKDF2 para generar la clave o es eso demasiado exagerado para todas las aplicaciones criptográficas excepto para las más extremas?

+1

sal la contraseña – helloandre

Respuesta

4

Este artículo sobre Key strengthening podría ayudarle. Básicamente, desea fortalecer la clave (más entropía que en una contraseña) y hacer que su derivación de la contraseña consuma tiempo de manera confiable.

+0

Gracias, eso es exactamente lo que estaba buscando. – Charles

1

Bueno, ya que su puesto es en general, permítanme decir algunas cosas generales:

  1. MD5, SHA-0, SHA-1 son todos los hashes rotos, y no debe utilizarlos para cualquier criptográfica propósito, use SHA-2.

  2. En general, debe utilizar enfoques bien conocidos y documentados para derribar claves de contraseñas (no menciona qué idioma, indique cuál está utilizando).

  3. Al hacer cualquier tipo de programación de seguridad, lo más importante es, antes de hacer cualquier cosa, documentar estrictamente su "modelo de amenaza". Esto es básicamente una lista de todos los ataques que intentas prevenir, y cómo lo harás, y también qué tipo de ataques no puedes evitar. Es muy divertido de hacer, y podrás aprender sobre todos los ataques y otras cosas interesantes.

+1

1. Las vulnerabilidades en MD5 no importan para mis propósitos porque Solo lo estoy usando para derivar una clave de una cadena de longitud variable.Si un adversario alguna vez obtiene el hash, el juego termina de todos modos, ya que eso es lo que se suponía que era el secreto todo el tiempo. Los ataques de colisión ni siquiera entran en el campo de juego aquí, hasta donde yo sé. 2. Esto es lo que intento hacer haciendo la pregunta anterior. :) El lenguaje de programación no importa porque esta es una cuestión de teoría, no de implementación. Pero en caso de que solo tengas curiosidad, estoy usando Python. 3. Esto también es lo que trato de hacer aquí. :) – Charles

+0

Amigo, no creo que estés leyendo lo que estoy escribiendo. :) – Charles

+0

Charles, Silky tiene razón. No uses ninguno de los hash que menciona. Si haces las preguntas que eres, no entiendes las implicaciones de una función hash comprometida (no estoy afirmando que yo tampoco). Vaya a leer http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html – lambacck

0

La respuesta a su nueva pregunta es: definitivamente debe usar algo como PBKDF2 para generar la clave.

Supongo que va a tener una contraseña (al menos 10 caracteres y una puntuación más bajos que la derecha) que generará una clave AES-256. La clave se usará para cifrar/descifrar los archivos. Desea usar algo como PBKDF2 para disminuir la capacidad de alguien que obtiene su archivo para descubrir su clave/contraseña a través de ataques de fuerza bruta. Usar algo como PBKDF2 (¡y una sal aleatoria!) Aumenta el costo de romper el cifrado en el archivo.

Lo que realmente recomiendo es que utilice esto como un juguete y no para proteger algo que realmente importa. Si no es un experto en seguridad, va a cometer errores, incluso los expertos (y muchos de ellos juntos) cometer errores: http://www.sslshopper.com/article-ssl-and-tls-renegotiation-vulnerability-discovered.html

+0

Gracias por los consejos. Investigué mucho más después de plantear esta pregunta y terminé implementando PBKDF2. La mayor parte del trabajo pesado se realiza en bibliotecas escritas por personas mucho más inteligentes que yo. Aparte de eso, necesito comenzar en alguna parte y ¿qué mejor manera de asegurar que mi programa sea correcto que protegerlo (con suerte) mis propios datos? Soy muy consciente de los riesgos de rodar mi propia solución aquí y aceptarla por completo. Si termino el proyecto, espero lanzarlo como software de código abierto para que otros puedan analizar el código, agregar correcciones y, posiblemente, humillar públicamente mi trabajo. :) – Charles

Cuestiones relacionadas