SSHAはソルトSHA-1です。デフォルトでは、最後の4バイトがソルトです。slappasswdの出力は
'{<Hash Method>}<base64 converted hash and salt>'
したがって、テストするには、プレーンテキストのパスワードがソルト付きSHAと等しいかどうかを確認する必要があります。
- ハッシュメソッドの指定子をsedなどで取り除きます。
- base64文字列をデコードする
- 最後の4バイトを抽出します。これはソルトです
- ソルトをプレーンテキストのパスワードに連結します
- ハッシュ化
- 比較する
base64でデコードされた文字列には、ハッシュがバイナリ形式で含まれており、印刷できないため、odを使用して16進数に変換します。最初の3つのステップは、次のコードによって実行されています。
#!/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とその16進表現を使用します。
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のソルトバージョンです。