Sortie Slappasswd randomisée

10

Je m'attendais slappasswdà produire un hachage fixe, mais il semble que la sortie soit aléatoire car je n'obtiens jamais la même sortie pour le même mot de passe d'entrée:

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

Pendant l'authentification, comment slapd sait-il comment randomiser le hachage pour le mot de passe fourni de la même manière afin qu'il puisse correspondre au mot de passe défini en premier lieu?

Max
la source

Réponses:

8

Sortir sur une branche ici, mais je suppose que slappasswd utilise un hachage salé au lieu d'un hachage ordinaire. Cela signifie qu'il ajoute un préfixe aléatoire à votre mot de passe et enregistre ce préfixe aléatoire dans le cadre de la chaîne que vous voyez dans la sortie slappasswd. Lorsque vous tapez votre mot de passe, il y ajoute le préfixe, hache le résultat et le compare à la chaîne dans la sortie slappasswd. Si cela correspond, vous êtes dedans. Si ce n'est pas le cas, votre mot de passe était incorrect :)

wzzrd
la source
3
En effet. En particulier, la méthode de hachage par défaut pour slappasswdest {SSHA}, ou la version salée de SHA-1.
justarobert
Je suis d'accord, mais ma question demeure: si le sel finit dans le cadre du hachage, cela signifie que vous ne pouvez pas extraire le sel du mot de passe haché. En conséquence, comment slapd sait-il quel sel ajouter lors de la vérification du mot de passe? (il doit ajouter le même sel pour que les mots de passe hachés soient identiques).
Max
3
@user: la partie suivante {SSHA}contient à la fois le sel et le hachage.
user1686
8

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:

  1. supprimer le spécificateur de méthode de hachage avec par exemple sed.
  2. décoder la chaîne base64
  3. extraire les 4 derniers octets, c'est le sel
  4. concaténer le sel au mot de passe en texte brut
  5. le hacher
  6. 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

mxmlnkn
la source