¿Una idea para verificar la contraseña?

-1

Intentaré hacer esta idea lo más detallada posible, para ayudar a la comunidad a ayudar y, posiblemente, ayudar a otros con el mismo problema.

Información de fondo

Mi sistema tiene 60 usuarios. Cada usuario tiene una contraseña de 8 dígitos, que van desde 00000001-99999999. Estos son generados al azar para ser únicos por los administradores. Esta contraseña solo se usa como acceso de "verificación" a mi programa, no se usa para nada más. El programa y la contraseña se almacenan localmente.

Mi idea

Compilaría una base de datos de contraseñas de esta manera

Password = UsersPassword
Data = Randomly generated 128bit string (So every encryption is unique)
NewPassword = ""
For I to 20
  NewPassword = NewPassword & Hash(Password, SHA_512)
Next
EncryptFile(Data, UserPassword, ALG)

Esto significa que, aunque la contraseña del usuario solo tiene 10 mil millones de conjeturas, la contraseña para el cifrado tiene una longitud de 536870960 claves. Esto se convierte en mi tramo. Como en mi computadora, tratar de descifrar un archivo de este tipo tarda 60 segundos (esto es solo por concepto, lo haría un poco más rápido de uso).

Esto también significa que las contraseñas nunca se almacenan en el archivo, sino que es la propia contraseña que es la "verificación". Esto significa que una tabla de arco iris no funciona, la fuerza bruta sí lo hace y 10 billones no es enorme, pero si toma un segundo por supuesto, el valor de tiempo / esfuerzo entra en juego.

Aquí está el cifrado / cifrado que puedo usar;

  • CALG_3DES 0x00006603 Triple algoritmo de encriptación DES.
  • CALG_3DES_112 0x00006609 Cifrado DES triple de dos claves con una longitud de clave efectiva igual a 112 bits.
  • CALG_AES 0x00006611 Estándar de cifrado avanzado (AES).
  • CALG_AES_128 0x0000660e AES de 128 bits.
  • CALG_AES_192 0x0000660f 192 bit AES.
  • CALG_AES_256 0x00006610 AES de 256 bits.
  • CALG_AGREEDKEY_ANY 0x0000aa03 Identificador de algoritmo temporal para los identificadores de las claves acordadas por Diffie-Hellman.
  • CALG_CYLINK_MEK 0x0000660c Un algoritmo para crear una clave DES de 40 bits que tiene bits de paridad y bits clave cero para que su longitud de clave sea de 64 bits.
  • CALG_DES 0x00006601 algoritmo de cifrado DES.
  • CALG_DESX 0x00006604 algoritmo de cifrado DESX.

Sé que CALG_AES_256 es extremadamente fuerte pero de mis pruebas se ejecuta muy rápido. Necesito uno lento, las costuras CALG_AES_192 tardan más y, según mi investigación, son igualmente irrompibles.

¿Es esta una idea válida?

    
pregunta ian smith 13.09.2016 - 13:40
fuente

1 respuesta

5

Mucho mal, es difícil saber por dónde empezar.

Para resumir: tu idea es una mierda. Deséchelo y comience de nuevo con una biblioteca probada.

Primero: tus contraseñas apestan. Los 8 caracteres aleatorios aleatorios pueden ser forzados con la aplicación de muchos algoritmos de hashing de contraseña. Usted eligió un hash rápido y agradable y limita las contraseñas a 8 dígitos . Estos caerán rápidamente. Y como nota al margen, su esquema asignado por el administrador hace que las contraseñas sean más difíciles de cambiar y tiene un buen compromiso integrado en la forma del administrador que ya sabrá la contraseña.

Segundo: tu estiramiento clave apesta. Su hash de contraseña se basa en 20 rondas de un hash rápido (SHA-256). El buen uso de un hash rápido (en PBKDF-2) requiere decenas o cientos de miles de iteraciones como mínimo. Tu hash o bien hace un bit y una concatenación, no tengo claro tu terminología. De cualquier manera, siempre se aplica el mismo hashing porque no incluyó el contador en su hash. Si es un AND, entonces sus iteraciones en realidad no hacen nada porque andar algo consigo mismo es un no-op. Si se trata de una concatenación, puedes hacer un hash y repetirlo varias veces. Y su cifrado no utilizará una clave tan larga. Tampoco puedes arreglar esto simplemente lanzando el contador al hash. Si se juntan tantos números aleatorios, se obtendrán números casi siempre cero.

Finalmente, estás confiando en el tiempo para descifrar el archivo completo para la seguridad del sistema. Esto no funcionará. En su lugar, un atacante descifra solo una pequeña parte del archivo para verificar cada contraseña. Descifrarán lo suficiente como para que el texto se vea razonable, o se revelaría alguna "cadena mágica" para el tipo de archivo, si la contraseña fuera correcta. Luego pase a la siguiente contraseña si esta no es factible.

Con una buena clave, tienes razón en que AES de 192 bits es lo suficientemente fuerte. Pero tu llave apesta porque has rodado tu propio cripto. No hagas eso.

    
respondido por el Ben 13.09.2016 - 14:22
fuente

Lea otras preguntas en las etiquetas