Slappasswd输出随机


10

我原本希望slappasswd产生固定的哈希,但是由于我从未针对相同的输入密码获得相同的输出,因此输出似乎是随机的:

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

在身份验证期间,slapd如何知道如何以相同的方式随机化所提供密码的哈希,以便它可以与最初定义的密码匹配?

Answers:


8

在这里走出去,但我假设slappasswd使用的是盐腌哈希,而不是普通哈希。这意味着它将为您的密码添加一个随机前缀,并将该随机前缀保存为您在slappasswd输出中看到的字符串的一部分。当您输入密码时,它会在其上添加前缀,对结果进行哈希处理并将其与slappasswd输出中的字符串进行比较。如果匹配,则您在其中。如果不匹配,则您的密码错误:)


3
确实。特别是,默认的哈希方法slappasswd是{SSHA}或SHA-1的盐版。
justarobert

我同意,但是我的问题仍然存在:盐是否最终成为哈希的一部分,这意味着您无法从哈希密码中提取盐。因此,slapd在进行密码验证时如何知道要添加什么盐?(它必须添加相同的盐,以使散列密码相同)。
最多

3
@user:后面的部分{SSHA}包含盐又包含哈希。
user1686

8

SSHA是盐腌的SHA-1。默认情况下,后4个字节为盐。slappasswd的输出是

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

因此,为了测试纯文本密码是否等于加盐的SHA,您需要:

  1. 用例如sed剥离哈希方法说明符。
  2. 解码base64字符串
  3. 提取最后4个字节,这就是盐
  4. 将盐连接到纯文本密码
  5. 哈希它
  6. 相比

base64解码的字符串包含二进制形式的哈希,无法打印,因此我们将使用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;▒

因此,现在我们必须将盐连接到纯文本密码并对其进行哈希处理,这一次不加盐!我遇到的问题是理解,盐实际上可以是任何字符,包括不可打印的字符。为了连接这些不可打印的字符,我们将使用printf及其十六进制表示形式:

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

等于上面的哈希值。现在我们已经验证,“密码”与盐腌的SHA匹配。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.