SSHA est un SHA-1 salé. Par défaut, les 4 derniers octets sont le sel. La sortie de slappasswd est
'{<Hash Method>}<base64 converted hash and salt>'
Donc, pour tester si un mot de passe en texte brut est égal au SHA salé, vous devez:
- supprimer le spécificateur de méthode de hachage avec par exemple sed.
- décoder la chaîne base64
- extraire les 4 derniers octets, c'est le sel
- concaténer le sel au mot de passe en texte brut
- le hacher
- comparer
La chaîne décodée en base64 contient le hachage sous forme binaire et ne peut pas être imprimée, nous allons donc le convertir en hexadécimal avec od. Les 3 premières étapes sont effectuées par le code suivant:
#!/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"
La sortie pourrait être:
{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;▒
Alors maintenant, nous devons concaténer le sel au mot de passe en texte brut et le hacher, cette fois sans salage! Le problème que j'avais était de comprendre que le sel pouvait être n'importe quel caractère, y compris les caractères non imprimables. Afin de concaténer ces caractères non imprimables, nous utiliserons printf et leurs représentations hexadécimales:
slappasswd -h {SHA} -s $(printf 'password\xd3\x62\x3b\x87') | sed 's/{SHA}//' | base64 -d | od -A n -t x1
La sortie est:
7c 3b b4 3e 02 83 9f 50 e2 f5 6d 47 30 83 69 3d 74 6a 43 d8
Ce qui est égal au hachage ci-dessus. Maintenant, nous avons vérifié que ce «mot de passe» correspond au SHA salé.
Merci et lecture supplémentaire: http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
est {SSHA}, ou la version salée de SHA-1.