Contraseña del usuario como clave en lugar de hash

5

Estaba leyendo aquí en Hashes and Salts y pensé en otro método para realizar la autenticación de usuario. Necesito tus pensamientos sobre esto ya que podría estar pasando por alto algo.

Escenario:

Para la autenticación de aplicaciones web, la tendencia general es aplicar hash a la contraseña agregando un salt aleatorio, con una función hash fuerte. La sal aleatoria y el hash generado se almacenan en la base de datos. Más tarde, cuando el usuario desea autenticarse, el usuario ingresó la contraseña nuevamente con el sal almacenado y el hash generado se compara con el hash previamente almacenado.

Ahora sobre mi método:

  1. Almacenamos un texto secreto maestro (siempre que sea necesario) en nuestra base de datos y usamos sal única por usuario.
  2. En lugar de almacenar el hash de contraseña, ciframos simétricamente (hash (master secret + salt)) usando la contraseña del usuario como clave y almacenamos este valor cifrado en nuestra base de datos.
  3. Cuando el usuario quiera autenticarse, este valor cifrado previamente almacenado se descifrará utilizando la contraseña del usuario como clave y obtendremos un hash (maestro secreto + sal). Este hash descifrado se comparará con el hash recién calculado (maestro secreto + sal)
  4. Si el usuario ingresa una contraseña incorrecta, el descifrado fallará y obtendremos un hash incorrecto que no se comparará con el hash (maestro secreto + sal)

De esta manera, no almacenamos la contraseña del usuario en la base de datos de ninguna forma (texto sin formato, hash, cifrado). Quiero saber cómo se compara este método con nuestro método habitual de hash de contraseñas.

    
pregunta anilmwr 26.07.2013 - 07:20
fuente

4 respuestas

7

Usted Do almacena la contraseña "hash". Para ser precisos, almacena algunos datos en el servidor:

  • Un valor S (la "sal").
  • El "secreto maestro" M (que no puede ser realmente secreto, ya que el servidor lo almacena "como está" en algún lugar de sus entrañas).
  • E (h (M || S), K) : cifrado del hash de la concatenación de M y S , usando la tecla K que se deriva más o menos directamente de la contraseña del usuario.

Dados estos elementos de datos y una contraseña potencial P , es posible realizar algunos cálculos que dan como resultado un resultado booleano: P es la contraseña correcta, o no. Eso es normal: el servidor debe poder verificar una contraseña entrante, utilizando lo que el servidor "sabe" solamente. Pero si el servidor puede hacerlo, un atacante que obtuvo una copia de los datos del servidor también puede hacerlo. Eso es ineludible. Los elementos de datos almacenados no se pueden usar directamente para volver a calcular la contraseña, solo para verificar una contraseña determinada, por lo que es unidireccional.

Esto se llama hashing de contraseña . Que hay un llamado "secreto maestro" y que una función de encriptación que se usa internamente son solo pistas falsas; simplemente está creando una función de hashing de contraseña personalizada.

puede tener algún valor en el "secreto maestro" si realmente logras mantenerlo en "secreto". El servidor debe saberlo para poder funcionar, por lo que no está realmente oculto, pero puede hacer que no se almacene en la base de datos , manteniéndolo fuera de alcance de los ataques de inyección de SQL habituales. Sin embargo, no hará nada contra un atacante que haya obtenido un shell raíz en su servidor.

El uso de un "secreto" de este tipo en una función de hashing de contraseñas se denomina "salpicadura" y la forma normal de hacerlo, aprobada por criptógrafo, es hacer que la función de hashing de contraseñas sea MAC con el" secreto "como clave.

Consulte esta larga respuesta para obtener una introducción a la contraseña hashing, sus conceptos, herramientas y terminología.

    
respondido por el Tom Leek 26.07.2013 - 13:33
fuente
1

He entendido tu concepto de la siguiente manera: -

Master Secret = "ReallyRandomAndSecureStringToUseAsASecret"

**User Registration**
dbPwd = Encrypt((hash(MasterSecret,Unique Salt),Key)
Store dbPwd

**User Login**
Take key as input.
Obtain MasterSecret and Unique Salt from DB.

dbHash = Decrypt(dbPwd,Key)

If, hash(MasterSecret + Unique Salt) == dbHash
    //Valid Login
else
    // Invalid Login

Puntos a considerar: Si se compromete un servidor, se revelarán Master Secret, Unique Salt y dbPwd.

dbHash = Conocido por la desviación de hash (MasterSecret, Unique Salt). dbPwd = Conocido desde db.

Ahora, un atacante podría descifrar sin conexión con fuerza bruta (dbPwd, Clave) en la que la Clave varía con reglas, una lista de palabras, etc.

Por lo tanto, aunque es bastante innovador, no creo que su método proporcione una ventaja de seguridad a menos que esté esperando que la oscuridad del mecanismo detenga al atacante.

tl;dr:

Cons:

  

La seguridad de cualquier sistema depende en gran medida del conocimiento y la mentalidad de la persona que lo usa. - Mati Aharoni

1) Su sistema requiere que un atacante resuelva un descifrado simétrico en lugar de calcular un hash de una sola vía. En cualquier caso, si la contraseña del usuario es débil, se romperá.

2) Fuerza del algoritmo de cifrado simétrico utilizado.

Creo que los hashes unidireccionales son más difíciles de resolver computacionalmente que un cifrado simétrico, sin embargo, esta es una comparación entre los algoritmos exactos utilizados.

Pros: Su método parece asegurar que si la contraseña del usuario es segura, evitará la colisión de hash. La colisión de hash es responsable (en ciertos casos) de permitir el acceso a una cuenta, incluso a través de la contraseña verdadera, se desconoce. Sin embargo, tenga en cuenta que esto se debe al precio de sus dbPwds de longitud variable en lugar de hashes de longitud fija. Esto debería ser considerado durante el desarrollo. Ref. : enlace

    
respondido por el Rohan Durve 26.07.2013 - 10:44
fuente
0

Suponiendo que un atacante tenga acceso al secreto, a la sal y al valor hash cifrado almacenado en la base de datos, entonces debe preocuparse por la fortaleza de su esquema de cifrado simétrico. Su cifrado debe ser resistente a los ataques de texto plano conocido ( enlace ). Actualmente, se podría utilizar AES.

    
respondido por el someone 26.07.2013 - 10:04
fuente
0

Si el atacante conoce el algoritmo de cifrado / hash que está utilizando, que puede obtener del código fuente, puede usar la fuerza bruta como de costumbre. Primero descifre con la clave que está probando, luego compare los hashes.

Tenga en cuenta que esto alterará la tasa de colisión del hash.

En su lugar, simplemente agregaría un poco de pimienta al hash: sería más predecible para usted y más fácil de explotar. Intenta no encajar en ninguno de los más comunes, como los que admite oclhashcat.

    
respondido por el Filip Haglund 26.07.2013 - 11:46
fuente

Lea otras preguntas en las etiquetas