Programming
| No. | 135 |
| Name. | swindler |
| Subject. | Linux 사용자 passwd 관련 |
| Main Cate. | C/C++ |
| Sub Cate. | |
| Date. | 2005-07-05 14:20 |
| Hit. | 4436 (211.109....) |
| File. | |
| 4.2 사용자 패스워드 체크는 어떻게 하는가? ===================================== 4.2.1 사용자 패스워드를 얻는 방법은? ------------------------------------- 전통적으로 대부분의 유닉스에서 사용자 패스워드는 /etc/passwd에 저장된다. 그리고 다음의 형 태로 저장된다. username:password:uid:gid:gecos field:home directory:login shell 시간이 지나면서 이것이 변경될 지라도 현재 사용자 정보는 다른 호스트에 유지 될 수 있으며, 굳이 사용자 정보가 /etc/passwd파일에 있을 필요는 없다. 현대 유닉스들은 또한 shadow 패스워 드파일을 사용하여 중요한 정보인 패스워드를 보관한다. 이 파일은 허용된 사용자에게만 읽기 가 능하다. 패스워드는 알아볼 수 있는 상태로 저장 되지 않고 보안 문제 때문에 암호화 되어 저장된다. POSIX는 이러한 데이터베이스를 질의하기 위한 함수들을 제공한다. 사용자에 대한 독립된 레코 드를 얻기 위한 가장 빠른 방법은 getpwnam()과 getpwuid()를 사용하는 것이다. 이 두 함수는 여러 사용자 정보를 가지고 있는 패스워드 구조체에 대한 포인터를 리턴한다. getpwnam()은 사 용자 이름을 입력 받고, getpwuid()는 사용자의 uid를 입력 받는다. 그리고 만약 이 두 함수가 실 패하면 NULL을 리턴한다. 그러나 전에 기술했던 것처럼 대부분의 현대 시스템들은 shadow 데이터베이스에 가장 민감한 부 분의 정보인 사용자 패스워드 등의 정보를 가지고 있다. 몇몇 시스템들은 수퍼유저 일 경우에만 uid를 호출에 패스워드를 리턴한다. 다른 몇몇 시스템들은 shadow패스워드를 접근 하는데 여러분 들이 다른 함수들을 사용하도록 요구할 것이다. 만약 이것이 여러분들이 사용자 이름을 입력받아 spwd구조체를 리턴하는 getspnam()의 사용을 원하는 경우라면, 다시 말해서, 이것을 성공적으로 하기 위해서 여러분들은 권한이 필요하다는 것이다.(몇몇 시스템, 즉 HP-UX와 SCO에서는 getprpwnam()을 대신 사용하라) 4.2.2 uid로 shadow패스워드를 얻을 수 있는가? ------------------------------------------- 나의 시스템은 getsp* 계열의 루틴을을 사용해 사용자 정보를 가져오도록 되어 있다. 그러나 나는 getspuid()는 없고 getspnam()만 있다. 어떻게 했으면 좋겠나? uid로 shadow패스워드를 얻고 싶다. 뭐 어려워 보이진 않는다. 다음의 루틴을 사용자 라이브러리에 넣고 사용하라 #include #include #include #include struct spwd *getspuid(uid_t pw_uid) { struct spwd *shadow; struct passwd *ppasswd; if( ((ppasswd = getpwuid(pw_uid)) == NULL) || ((shadow = getspnam(ppasswd->pw_name)) == NULL)) return NULL; return shadow; } 문제는, 몇몇 시스템에서는 uid를 사용하지 않거나 shadow 데이터베이스에 다른 정보가 있다는 사실이다. 4.2.3 사용자 패스워드를 확인하는 방법이 있는가? ---------------------------------------- 기본적인 문제는 이것이다. 즉 다양한 인증 시스템이 존재하고 패스워드는 항상 그 패스워드가 아니라는 점이다. 뭔소린고 하니 유닉스 패스워드를 암호화 하는 알고리즘이 계속 바뀐다는 의미 이다. 몇몇 시스템에서는 DES 암호화 알고리즘을 사용했지만 어떤 시스템 특히 국제화 버전 FreeBSD등에서는 MD5를 사용한다. 가장 많이 쓰이는 방법은 단방향 암호화 알고리즘인데 이것은 한 번 암호화 된 후에 복호화 되지 않는(정확히 말해 거의 힘들다)다. 대신 그 패스워드는 clear text로 입력 받고 암호화 되어 패스 워드 파일에 저장된다. 어떻게 암호화 하는지 같은 물음은 crypt()의 매뉴얼을 찾아보라. 여기서는 사용법을 설명한다. /* 평문 패스워드와 암호화된 패스워드가 주어졌을 때 그들이 매치되면 1을 리턴하고 그렇지 않다면 0을 리턴한다. */ int check_pass(const char *plainpw, const char *cryptpw) { return strcmp(crypt(plainpw,cryptpw), cryptpw) == 0; } 이것은 패스워드 암호화에 사용된 salt가 암호화된 패스워드의 부분 문자열로 저장되어 있기 때문 에 잘 동작한다. *경고* 몇몇 시스템에서 패스워드 암호화는 실제로 다양한 호출로 이루어 진다. 즉 bigcrypt()와 같은... [바로가기 링크] : http://coolx.net/cboard/develop/135 |
|
|
|
|
| [Modify] [Delete] | [Reply] [List] | |



Copyright © 1999-2017, swindler. All rights reserved.
367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)