Slappasswd输出随机

我期待slappasswd产生一个固定的散列,但看起来输出是随机的,因为我从来没有得到相同的input密码相同的输出:

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

在authentication过程中, slapd如何知道如何以相同的方式随机化提供的密码的哈希值,以便能够匹配首先定义的密码?

在这里出去走走,但我认为slappasswd是使用一个盐渍散列,而不是一个简单的散列。 这意味着它会为您的密码添加一个随机前缀,并将随机前缀保存为您在slappasswd输出中看到的string的一部分。 当你input你的密码时,它将前缀添加到它,散列结果并将其与slappasswd输出中的string进行比较。 如果它匹配,你在。如果没有,你的密码是错误的:)

SSHA是一种盐渍的SHA-1。 默认情况下,最后的4个字节是盐。 slappasswd的输出是

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

因此,为了testing,明文密码是否等于咸的SHA,您需要:

  1. 用例如sed去除散列方法说明符。
  2. 解码base64string
  3. 提取最后4个字节,这是盐
  4. 将salt连接到纯文本密码
  5. 哈希它
  6. 比较

base64解码的string包含二进制forms的散列,不能打印,所以我们将它转​​换为hex与od。 前三个步骤由以下代码完成:

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

输出可以是:

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

所以现在我们不得不将salt与纯文本密码连接起来,并且把这个密码散列起来,这次不用腌制! 我遇到的问题是理解,盐可以是任何字符,包括不可打印的字符。 为了连接这些不可打印的字符,我们将使用printf及其hex表示法:

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

输出是:

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

这等于上面的散列。 现在我们已经validation了,“密码”与咸的SHA匹配。

感谢和进一步阅读: http : //cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm