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
위의 해시와 같습니다. 이제 'password'가 소금에 절인 SHA와 일치하는지 확인했습니다.
감사와 추가 읽기 : http://cpansearch.perl.org/src/GSHANK/Crypt-SaltedHash-0.09/lib/Crypt/SaltedHash.pm
slappasswd
은 {SSHA} 또는 솔트 버전 SHA-1입니다.