SSHA是盐腌的SHA-1。默认情况下,后4个字节为盐。slappasswd的输出是
'{<Hash Method>}<base64 converted hash and salt>'
因此,为了测试纯文本密码是否等于加盐的SHA,您需要:
- 用例如sed剥离哈希方法说明符。
- 解码base64字符串
- 提取最后4个字节,这就是盐
- 将盐连接到纯文本密码
- 哈希它
- 相比
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
slappasswd
是{SSHA}或SHA-1的盐版。