Linux(Ubuntu) /etc/shadow에 저장된 해시(ASCII) 코드가 궁금합니다.
가상의 경우를 가정하여 비밀번호를 다음과 같이 설정합니다.'시험', 소금이 되라'Zem197T4'.
다음 명령을 실행하여,
$ mkpasswd -m SHA-512 test Zem197T4
긴 일련의 ASCII 문자가 생성됩니다(실제로 Linux가 /etc/shadow에 저장하는 방식입니다).
$6$Zem197T4$oCUr0iMuvRJnMqk3FFi72KWuLAcKU.ydjfMvuXAHgpzNtijJFrGv80tifR1ySJWsb4sdPJqxzCLwUFkX6FKVZ0
온라인 SHA-512 생성기를 사용하는 경우(예:http://www.insidepro.com/hashes.php?lang=eng), 생성되는 것은 아래와 같은 16진수 코드입니다.
옵션 1) 비밀번호+소금
8d4b73598280019ef818e44eb4493c661b871bf758663d52907c762f649fe3355f698ccabb3b0c59e44f1f6db06ef4690c16a2682382617c6121925082613fe2
옵션 2) 소금+비밀번호
b0197333c018b3b26856473296fcb8637c4f58ab7f4ee2d6868919162fa6a61c8ba93824019aa158e62ccf611c829026b168fc4bf90b2e6b63c0f617198006c2
나는 이 16진수 코드가 mkpasswd에 의해 생성된 ASCII 코드와 '동일'해야 한다고 믿습니다. 그러나 그들은 어떻게 관련되어 있습니까?
누군가가 나를 깨달을 수 있기를 바랍니다.
답변1
Ubuntu/Debian에서는 mkpasswd
패키지의 일부입니다.후이즈실제로 는 에서 선언된 glibc의 함수를 mkpasswd.c
둘러싼 정교한 래퍼 로 구현되었습니다 . crypt()는 비밀번호와 솔트라는 두 가지 인수를 사용합니다. 이 경우 비밀번호는 "test"이고 SHA-512 해시의 경우 salt 앞에 "$6$"가 추가됩니다(참조:crypt()
unistd.h
SHA 암호화) 따라서 "$6$Zem197T4"가 crypt()에 전달됩니다.
어쩌면 당신은 라운드 수를 결정하는 -R
옵션을 발견했을 것입니다. mkpasswd
문서에서 기본값은 5000라운드입니다. 이는 결과가 솔트와 비밀번호의 단순한 연결과 절대 같지 않고 한 번만 해시되지 않는 첫 번째 힌트입니다. 실제로 통과하면 -R 5000
동일한 결과를 얻게 됩니다. 이 경우 "$6$rounds=5000$Zem197T4"는 crypt()에 전달되고 glibc(Debian/Ubuntu의 libc)의 구현은 여기에서 라운드 수와 방법을 추출합니다.
crypt() 내부에서 발생하는 일은 단일 해시를 계산하는 것보다 더 복잡하며 결과는 결국 base64로 인코딩됩니다. 그렇기 때문에 귀하가 보여준 결과에는 SHA-512 해시의 일반적인 16진수 문자열에서처럼 [0-9a-f]뿐만 아니라 마지막 '$' 뒤에 모든 종류의 문자가 포함되어 있습니다. 알고리즘은 이미 언급한 부분에 자세히 설명되어 있습니다.SHA-크립트문서.
답변2
솔트된 비밀번호를 사용하는 전체적인 아이디어는 동일한 비밀번호에 대한 해시를 생성할 때마다 다른 결과를 얻는다는 것입니다. 이는 레인보우 테이블의 문제를 방지하기 위한 것입니다.
사용자 중 한 명이 취약한 비밀번호(예: 123456)를 사용한다고 가정하면 /etc/shadow가 노출되었습니다. 이제 사악한 해커가 해야 할 일은 레인보우 테이블을 사용하여 취약한 비밀번호를 찾아내고 다른 위치에서 다시 사용하는 것뿐입니다.