Uscita Slappasswd randomizzata


10

Mi aspettavo slappasswddi produrre un hash fisso ma sembra che l'output sia randomizzato in quanto non ottengo mai lo stesso output per la stessa password di input:

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

Durante l'autenticazione, come fa slapd a sapere come randomizzare l'hash per la password fornita allo stesso modo in modo che possa corrispondere alla password definita in primo luogo?

Risposte:


8

Andare su un arto qui, ma presumo che slappasswd stia usando un hash salato invece di un semplice hash. Ciò significa che aggiunge un prefisso casuale alla tua password e salva quel prefisso casuale come parte della stringa che vedi nell'output slappasswd. Quando si digita la password, aggiunge il prefisso, esegue l'hashing del risultato e lo confronta con la stringa nell'output slappasswd. Se corrisponde, ci si trova. In caso contrario, la password era errata :)


3
Infatti. In particolare, il metodo hash predefinito per slappasswdè {SSHA} o la versione salata di SHA-1.
justarobert,

Sono d'accordo, ma la mia domanda rimane: se il sale finisce come parte dell'hash significa che non è possibile estrarre il sale dalla password con hash. Di conseguenza, come fa slapd a sapere quale sale aggiungere quando si esegue la verifica della password? (deve aggiungere lo stesso sale affinché le password con hash siano le stesse).
Max

3
@utente: la parte successiva {SSHA}contiene sia il sale che l'hash.
user1686,

8

SSHA è un SHA-1 salato. Per impostazione predefinita, gli ultimi 4 byte sono il sale. L'output di slappasswd è

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

Pertanto, per verificare se una password in testo normale è uguale alla SHA salata, è necessario:

  1. eliminare lo specificatore del metodo hash con es. sed.
  2. decodifica la stringa base64
  3. estrarre gli ultimi 4 byte, questo è il sale
  4. concatenare il sale con la password del testo normale
  5. l'ha fatto
  6. confrontare

La stringa decodificata base64 contiene l'hash in forma binaria e non può essere stampata, quindi la convertiremo in esadecimale con od. I primi 3 passaggi vengono eseguiti con il seguente codice:

#!/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"

L'output potrebbe essere:

{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;▒

Quindi ora dobbiamo concatenare il sale con la password in chiaro e l'hash, questa volta senza salare! Il problema che ho avuto è stato capire che il sale può davvero essere qualsiasi personaggio, compresi i caratteri non stampabili. Per concatenare questi caratteri non stampabili useremo printf e le loro rappresentazioni esadecimali:

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

L'output è:

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

Che è uguale all'hash sopra. Ora abbiamo verificato che la 'password' corrisponde allo SHA salato.

Grazie e ulteriori letture: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.