Esperaba slappasswd
producir 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?
slappasswd
es {SSHA}, o la versión salada de SHA-1.{SSHA}
contiene tanto la sal como el hash.SSHA es un SHA-1 salado. Por defecto, los últimos 4 bytes son la sal. La salida de slappasswd es
Entonces, para probar, si una contraseña de texto sin formato es igual al SHA salado, debe:
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:
El resultado podría ser:
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:
El resultado es:
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
fuente