내 관련 질문이 그다지 주목을 받지 못하는 것 같아서 또 다른 질문이 있습니다. 요즘 Linux에서 사용자 이름/비밀번호 프롬프트를 통해 사용자를 인증하는 올바른 방법은 무엇입니까?
원칙적으로는 사용자 이름과 비밀번호를 가져와서 해당 사용자의 솔트와 해시를 읽어야 한다고 생각합니다 /etc/shadow
. 그런 다음 주어진 비밀번호와 저장된 솔트의 해시를 계산하고 결과가 /etc/shadow
.
일반적으로 이미 모든 작업을 수행하는 PAM(예를 들어)을 통해 간단히 pam_unix
인증할 수 있지만 내 애플리케이션은 사용자 정의 PAM 모듈이고 다른 PAM 모듈에서 하나의 PAM 모듈을 호출할 방법을 찾지 못했습니다. 이것이 가능하다면 기꺼이 이 솔루션을 채택하겠습니다.
현재로서는 이 튜토리얼이 정말 오래된 것 같습니다.http://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.html1996년 현재 libc에는 섀도우 지원이 아직 내장되지 않은 것 같습니다. 인증을 위한 도우미 기능으로 pw_auth
및 를 언급합니다 . valid
이를 내 코드에 포함하고 libshadow.a
섀도우 도구 에 연결하려고 시도했지만 pw_auth
및 에 대해 "해결되지 않은 외부 참조" 오류가 발생합니다 valid
. 코드는 다음과 같습니다.
if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
&& pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
|| !valid (passwd, pw)) {
return (UPAP_AUTHNAK);
}
이것을 더 자세히 확인하지는 않았지만 Shadow-utils가 업데이트될 때마다 코드를 업데이트해야 하기 때문에 어쨌든 선호되는 솔루션은 아닙니다.
차라리 을(를) 타겟팅하는 제공업체에 연결하고 싶습니다 /etc/shadow
. 아직 찾지 못한 것이 있나요? 아니면 다른 솔루션?
답변1
제 생각에는 Shadow-utils 업데이트에 대한 귀하의 두려움은 근거가 없습니다. 이 HOWTO에 설명된 루틴은 특별한 것을 설치하지 않고도 Ubuntu 12.04 및 Mint 17 시스템에서 작동합니다.
/etc/shadow
C 프로그램에서 정보를 읽는 구조는 /usr/include/shadow.h
및 에서 찾을 수 man 5 shadow
있으며, 예를 들어 섀도우 비밀번호 항목을 이름으로 정의하는 함수를 찾아야 합니다. /usr/include/shadow.h
그러면 해당 내용과 모든 관련 기능을 설명하는 getspnam
매뉴얼 페이지( )도 제공됩니다. man getspnam
.
이를 기반으로 특정 이름에 대해 해시된 비밀번호 항목을 얻을 수 있어야 합니다. 해시된 비밀번호에는 여러 개의 "$" 토큰이 있어야 하며, 해시된 비밀번호에서 마지막 "$"를 포함하여 마지막 "$" 이후의 모든 항목을 제거하고 이를 솔트로 제공해야 합니다. crypt()
glibc 버전(버전에 따라 다름 man 3 crypt
)은 처리할 수 있어야 합니다. "확장" 솔트는 오늘날 더 일반적인 SHA512 항목을 나타냅니다.