Linux 솔티드 sha512 비밀번호 해시를 LDAP 형식으로 변환할 수 있습니까?

Linux 솔티드 sha512 비밀번호 해시를 LDAP 형식으로 변환할 수 있습니까?

비밀번호 및 기타 사용자 데이터를 저장하는 LDAP 서버가 있습니다.
그러나 서버는 클라이언트 컴퓨터 인증에는 사용되지 않고 클라이언트 응용 프로그램 인증에만 사용됩니다.
따라서 사용자는 클라이언트에서 로컬로 비밀번호를 변경할 수 있습니다.
Linux 해시를 LDAP에 {CRYPT}$hash로 저장할 수 있으며 crypt를 사용하는 한 잘 작동합니다.
이제 비밀번호는 솔트된 sha512 해시로 저장되며
/etc/shadow의 비밀번호 형식은 다음과 같습니다.

printf( "$6$%s$%s", $salt, $hash )  

$salt는 단지 ASCII 문자열인 것 같습니다.
$hash는 $plainPW와 $salt 연결의 sha512 다이제스트의 Base64 인코딩 결과에서 나온 것 같지만 확실하지 않습니다.

대신 LDAP는 비밀번호 해시를 다음과 같이 저장합니다.

printf( "{SSHA512}%s", $_96byteString )  

$_96byteString은 $saltedPWhash와 $salt를 512비트로 연결한 base64 인코딩 결과입니다.

$hash를 base64_decoding하고, $salt를 추가하고, 결과를 base64_encoding하고, 위 LDAP 형식의 $_96byteString으로 저장해 보았습니다.
아쉽게도 LDAP는 이를 인증할 수 없으며 간단한 ldapbind가 실패합니다.

LDAP 서버가 이를 유효한 것으로 승인하도록 Linux sha512 해시를 변환하는 방법을 아는 사람이 있습니까?

나는 Linux crypt가 표준 MIME과 다른 base64 인코딩을 사용한다는 것을 발견했습니다.
Standard는 [A-Za-z0-9+/]를 사용하고 crypt는 [./0-9A-Za-z]를 사용합니다.
그래서 tr로 변환을 시도했지만 결과는 여전히 실패했습니다. :-(

답변1

나는 이것이 가능하다고 생각하지 않습니다.

@Eir Nym이 말했듯이 비밀번호를 모르면 비밀번호의 MD5 해시를 SHA-256 해시로 변환할 수 없습니다.

그러나 당신은 할 것입니다생각하다SHA-256 해시(crypt(3)에 따름)를 SHA-256 해시(OpenLDAP에 따름)로 변환할 수 있습니다. 물론 이는 하나의 형식에서 솔트와 해시를 식별하고 순서를 변경하기만 하면 됩니다. 상대방이 예상하는 형식입니다. 아니요? 그렇지 않습니까? !

OpenLDAP에서 속성의 형식은 userPassword비록 완전히 문서화되어 있지는 않지만 상대적으로 간단합니다. 즉, 고정 길이의 비밀번호 해시와 솔트가 뒤따르는 것입니다(예 contrib/slapd-modules/passwd/sha2:OpenLDAP 소스). 이는 댓글에서도 분명하게 드러납니다.이 OpenLDAP FAQ-o-matic 기사{SSHA}비밀번호 + 소금에서 해시를 생성하는 방법을 보여줍니다 .

그러나 crypt(3)를 사용하는 시스템의 경우 다음 형식의 "비밀번호 해시"가 표시됩니다.

$id$salt$hash

$5$SHA-256, $6$SHA-512 등을 의미합니다 . 요소는 hash키, 솔트 및 (일부 변형의 경우) 암호화 라운드 수의 일부 기능에 대한 Base64 인코딩 형식이지만 실제 기능은 문서화되어 있지 않습니다.

  • 이것Crypt에 관한 Wikipedia 페이지 (3) “시간이 지나면서 다양한 알고리즘이 도입됐다”고 언급했습니다.
  • 그것은 다음을 가리킨다"비밀번호 해시 경쟁" 사양(PHC)은 "해시" 문자열의 전체 형식을 좁히지만 원하는 만큼은 아닙니다. 문자열이 사용하는 Base64의 변형을 마무리하지도 않습니다(그런 것처럼 보이지만 문자가 [.-]무엇인지 말하지 않고 Base64 문자열에 나타날 수 있음을 인정합니다).
  • 이것비밀번호 라이브러리 일부 혼란을 인정하고("위의 모든 내용은 기존 해시 및 운영 체제 구현 확인을 기반으로 한 추측입니다.") PHC 형식을 권장합니다.
  • linuxquestions.org 질문 관련 base64 인코딩이 특별함을 나타냅니다.

그래서 우리가 좀 살펴볼 수 있어요glibc 소스 코드 지하실을 위해. 여기서 우리는 crypt_util.cbase64 알파벳이 더 일반적인(및 PHC 지정) 알파벳 (마지막 두 문자가 가끔 변형되는 경우) "./0-9A-Za-b"대신 사용된다는 점에서 정말 이상하다는 것을 발견했습니다. "A-Za-z0-9+/"도움이 되지는 않지만, 그것이 유일한 차이점이라면 처리할 수 있습니다.

그러나 sha256-crypt.c예를 들어 이 라이브러리의 함수는 키와 솔트를 사용하여 매우 이상하고 장황한 작업을 수행하여 값을 생성합니다 hash. 나는 그것이 하고 있는 일의 지혜에 대한 의견을 위험에 빠뜨리고 싶지 않지만 확실히 간단하지는 않습니다.

이는 crypt(3) $5$및 OpenLDAP 'SHA-256' 해시가 표면적으로는 동일한 암호화 기본 요소를 사용하지만 실제로는 완전히 다른 방식으로 사용한다는 것을 의미합니다.그들은 다른 해시 함수와 동일합니다따라서 상단의 포인트처럼 비밀번호를 모르면 하나를 다른 것으로 변환할 수 없습니다. /SHA-512 비밀번호 에 대해서도 $6$비슷한 결론을 내릴 수 있습니다 .

이것은 매우 성가신 일입니다.


메모: 공교롭게도 $1$crypt(3) 형식과 OpenLDAP 간에 /SMD5 '해시'를 변환하는 것이 가능합니다.

$1$salt$hash

에 해당

'{SMD5}' + hash + salt

그 중에는 +간단한 문자열 연결이 있습니다. 하지만 더 이상 MD5 해시를 사용해서는 안 되므로 이는 별로 도움이 되지 않습니다.

또한 다음을 사용하여 crypt(3) 해시를 변경하지 않고 OpenLDAP로 포팅할 수 있습니다.

{CRYPT}$1$salt$hash

libc가 호환되는 경우(일반적으로 OpenLDAP가 Linux에서 실행되는 경우입니다.) 그러나 OpenLDAP는 이런 방식으로 새 비밀번호를 생성하지 않으므로 일방 통행입니다.

답변2

간단히 말해서 대답은 '아니요'입니다. 원래 비밀번호를 모르고 무차별 대입이나 기타 공격을 사용하지 않으면 하나의 비밀번호 해시를 다른 비밀번호 해시로 직접 코딩할 수 없습니다. 하지만 비밀번호가 정확하면 투명 레이어를 구축하고 해시를 변환할 수 있습니다.

이 질문은 다음과 같이 여러 번 요청되었습니다.여기.

내 소프트웨어에서 내가 사용하는비밀번호 라이브러리도서관에서는 제가 방해하지 않고도 이 작업을 수행할 수 있습니다.

답변3

접두사를 사용하여 간단히 {CRYPT}비밀번호 해시를 추가 할 수 있습니다./etc/shadow사용자 암호value는 로컬 계정 데이터를 저장하는 시스템과 LDAP 서버에서 crypt(3) 기능을 제공합니다. 둘 다 동일한 해싱 체계를 구현합니다. 다른 시스템에 대해서는 crypt(3) 매뉴얼 페이지를 확인하십시오.

비밀번호를 설정할 때 OpenLDAP의 slapd가 특정 해시 패턴과 솔트 형식을 사용하여 crypt(3) 해시를 생성하도록 할 수도 있습니다.LDAP 비밀번호 수정 확장 작업(당신은 또한 볼 수 있습니다slapd.conf):

password-hash {CRYPT}
password-crypt-salt-format "$6$rounds=20000$%.16s"

실제로 위의 예는 단 하나의 해싱 라운드가 아닌 20000개의 해싱 라운드가 사용되어 무차별 대입 공격을 수행하는 데 필요한 작업량이 증가하므로 {SSHA512}보다 낫습니다.

관련 정보