Salida Slappasswd aleatorizada

10

Esperaba slappasswdproducir un hash fijo, pero parece que la salida es aleatoria ya que nunca obtengo la misma salida para la misma contraseña de entrada:

$ slappasswd -s secret
{SSHA}mCXsPZkfgQYZr2mKHpy5Iav+2S2XlVU3
$ slappasswd -s secret
{SSHA}62oXsalJBuopYfHhi6hGp6AESuWNIVnd
$ slappasswd -s secret
{SSHA}0Ulc8+ugMi3NbTtWnclOFW1LKCqRdsT8

Durante la autenticación, ¿ cómo sabe slapd cómo aleatorizar el hash para la contraseña proporcionada de la misma manera para que pueda coincidir con la contraseña definida en primer lugar?

Max
fuente

Respuestas:

8

Ir a una rama aquí, pero supongo que slappasswd está usando un hash salado en lugar de un hash simple. Esto significa que agrega un prefijo aleatorio a su contraseña y guarda ese prefijo aleatorio como parte de la cadena que ve en la salida slappasswd. Cuando escribe su contraseña, le agrega el prefijo, codifica el resultado y lo compara con la cadena en la salida slappasswd. Si coincide, estás dentro. Si no coincide, tu contraseña era incorrecta :)

wzzrd
fuente
3
En efecto. En particular, el método hash predeterminado para slappasswdes {SSHA}, o la versión salada de SHA-1.
justarobert
Estoy de acuerdo, pero mi pregunta sigue siendo: si la sal termina como parte del hash, eso significa que no puede extraer la sal de la contraseña hash. En consecuencia, ¿cómo sabe slapd qué sal agregar al hacer la verificación de contraseña? (tiene que agregar la misma sal para que las contraseñas hash sean las mismas).
Max
3
@user: La parte posterior {SSHA}contiene tanto la sal como el hash.
user1686
8

SSHA es un SHA-1 salado. Por defecto, los últimos 4 bytes son la sal. La salida de slappasswd es

'{<Hash Method>}<base64 converted hash and salt>'

Entonces, para probar, si una contraseña de texto sin formato es igual al SHA salado, debe:

  1. pele el especificador de método hash con, por ejemplo, sed.
  2. decodificar la cadena base64
  3. extraer los últimos 4 bytes, esta es la sal
  4. concatenar la sal a la contraseña de texto sin formato
  5. Ha golpeado
  6. comparar

La cadena decodificada en base64 contiene el hash en forma binaria y no se puede imprimir, por lo que lo convertiremos a hexadecimal con od. Los primeros 3 pasos los realiza el siguiente código:

#!/bin/bash
output=$(slappasswd -h {SSHA} -s password)
hashsalt=$( echo -n $output | sed 's/{SSHA}//' | base64 -d)
salt=${hashsalt:(-1),(-4)}
echo $output
echo $(echo -n $hashsalt | od -A n -t x1)
echo "Salt: $salt"

El resultado podría ser:

{SSHA}fDu0PgKDn1Di9W1HMINpPXRqQ9jTYjuH

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8 d3 62 3b 87
<------------------------- Hash --------------------------> <-- Salt-->

Salt: ▒b;▒

Así que ahora tenemos que concatenar la sal a la contraseña de texto sin formato y hash, esta vez sin sal! El problema que tuve fue entender que la sal realmente puede ser cualquier carácter, incluidos los caracteres no imprimibles. Para concatenar estos caracteres no imprimibles, utilizaremos printf y sus representaciones hexadecimales:

slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1

El resultado es:

7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8

Que es igual al hash anterior. Ahora hemos verificado que esa 'contraseña' coincide con el SHA salado.

Gracias y lecturas adicionales: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

mxmlnkn
fuente