¿Comprobando un hash con sal contra una contraseña conocida?

0

He creado un volcado mysql de mis usuarios y contraseñas y los he convertido en una forma presentable:

Contraseñas:

'6cc5db1c282daa071b0cf80982d19ec0f2e21976a4c39c0c7a3ab30f102b33e2780fd56f4d507e4873630eeb5ba1a8ad8d338bb8abcf64a513630a0dea7044db'
'1927f6acb76f53106a29015ba787e6f7c826f939a64be656a669f78515ffbb2447bee266e5f57751d98f4990f71d131bcb11575199b8e717a0ad91c381df43ca'
'dfd3b2e6478c0ca15102e74251a300abba96296662686f9eeba1f2ebbb9353ad9f91546d0c02ececd5e205c0a94e083a3f63eeec9642f69ad24fd674927c6a3d'

Sales:

'ecb2796f-e69d-4ad6-858f-832170b00b5c'
'a46a3486-79dd-428b-88a8-558303fe8dc8'
'02b6fedc-6932-4893-8725-cd4c8a191d57'

Con la primera entrada en una correspondiente a la primera en la otra. La contraseña para la primera entrada es contraseña. Estoy usando sha512whirlpool como algoritmo de hash.

Quiero usar una utilidad para codificar una cadena ("contraseña" en este caso) usando el mismo algoritmo y agregarlo a la contraseña y compararla con la contraseña codificada. ¿Alguien tiene alguna idea de qué utilidad podría ser buena para esto? Esperaba usar mkpasswd, pero recibí un error allí:

mkpasswd -m sha-512 password ecb2796f-e69d-4ad6-858f-832170b00b5c

Y este es el error:

Wrong salt length: 36 bytes when 8 <= n <= 16 expected.

¿Estaba haciendo algo mal aquí? ¿Algún consejo?

Nota: He transferido la pregunta aquí desde el desbordamiento de pila.

    
pregunta user2167980 08.03.2016 - 21:11
fuente

1 respuesta

5

SHA-512 y Whirlpool son dos funciones hash distintas, por lo que uno debe asumir que está usando una de ellas, no ambas. No hay una función hash llamada "sha512whirlpool"; este sería un híbrido muy profano.

Las funciones hash criptográficas no utilizan sales. Las funciones de hash de Contraseña son construcciones complicadas que pueden construirse con funciones de hash criptográficas u otros elementos. mkpasswd es una interfaz de línea de comandos para la función de la biblioteca C crypt() (que se ocupa del hashing de contraseñas y no con cifrado, a pesar de su nombre). En los sistemas Linux, crypt() admite varias construcciones de hashing de contraseñas, una de ellas con SHA-512 repetidamente, mezclando la contraseña y la sal en varios pasos. Esta no es de ninguna manera la única construcción de hash de contraseña de una función hash subyacente, por lo que no hay garantía de que los ejemplos que tiene a mano realmente usen esa función.

Las construcciones de hash de contraseñas tienden a funcionar sobre bytes , tanto para el salt como para la contraseña. Pero a los humanos les gusta leer caracteres . Por lo tanto, hay una traducción entre los dos y, de nuevo, no hay una convención universal. Sus sales, como "ecb2796f-e69d-4ad6-858f-832170b00b5c", recuerdan la codificación de cadena tradicional de UUID . Un UUID es un identificador de 128 bits, es decir, una secuencia de 16 bytes, pero la representación de caracteres utiliza hexadecimal con algunos guiones adicionales, para un total de 36 caracteres. Cuando invoca mkpasswd , esa herramienta intenta convertir la cadena de sal proporcionada no interpretándola como un UUID en hexadecimal con guiones, sino asignando cada carácter a su código ASCII, transformando así la cadena de 36 caracteres en un 36 -byte sal. A continuación, le reprende por proporcionar un salt de 36 bytes, mientras que la función interna solo espera una sal de legnth de 8 a 16 bytes.

Dado que la herramienta de línea de comandos mkpasswd espera que el sal sea una "cadena", el paso de bytes arbitrarios puede ser complicado en caso de que desee proporcionar bytes que no se asignen a caracteres imprimibles. La función crypt() en sí misma espera un salt que consta de bytes distintos de cero. Puede que tenga que recurrir a la programación ...

    
respondido por el Thomas Pornin 09.03.2016 - 00:39
fuente

Lea otras preguntas en las etiquetas