아이디와 패스워드가 동일한 계정 찾는 코드인데요.. 성능면에서
글쓴이: superkkt / 작성시간: 목, 2005/10/13 - 10:13오전
안녕하세요..
아이디와 패스워드가 동일한 계정을 찾는 코드를 만들어 봤습니다. 일단 정상 작동은 하는것 같은데요.. 혹시 잘못된 엔트리가 있어서 passwd와 shadow의 순서가 일치하지 않을 경우를 대비해서 chk_shadow함수의 처음에 rewind를 써서 파일의 처음부터 다시 검색을 하도록 했습니다.
계정이 얼마 없는 서버에서는 괜찮은데 좀 많은데서 테스트 해보니 좀 느리네요.. 성능개선을 좀 해볼라고 shadow파일 전체를 2차원 배열에 넣고 해볼까 했는데.. 쩝..초보라서 구현을 못하겠네요..
성능개선을 위한 힌트좀 부탁드립니다~
/*
* chk_shadow v0.1 2005/10/12
*
* 아이디와 패스워드가 동일한 계정을 찾아서 보여준다.
*
*/
#include <stdio.h>
#include <pwd.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void chk_shadow(FILE *fp, struct passwd *p);
void err_print(char *err_string);
int
main(void)
{
struct passwd *p;
FILE *fp;
if((fp = fopen("/etc/shadow", "r")) == NULL)
err_print("/etc/shadow open failed ");
while((p = getpwent()) != NULL) {
chk_shadow(fp, p);
}
endpwent();
fclose(fp);
return 0;
}
void
chk_shadow(FILE *fp, struct passwd *p)
{
char shadow[LINE_MAX];
char *id;
char *pw;
char salt[13];
rewind(fp); /* 파일의 처음으로 이동 */
while(fgets(shadow, LINE_MAX, fp) != NULL) {
if((id = strtok(shadow, ":")) == NULL)
err_print("shadow file ID entry parsing error ");
if((pw = strtok(NULL, ":")) == NULL)
err_print("shadow file PW entry parsing error ");
if(strcmp(id, p->pw_name) != 0) continue; /* 찾는 아이디가 아니면 다음줄로 이동 */
/* md5 구현 (리눅스) */
if(pw[0] == '$') { /* !!인 경우는 pw[2], pw[11]이 잘못된 포인터라서 */
if(pw[2] == '$' && pw[11] == '$') { /* 1, 3, 12번째가 $로 나오면 MD5를 사용한 암호화 */
strncpy(salt, pw, 12); /* MD5의 경우에는 앞 12글자가 salt 값이다 */
salt[12] = '\0';
}
}
/* 일반 crypt 구현 (솔라리스) */
else {
strncpy(salt, pw, 2); /* 일반 crypt의 경우에는 앞 2글자만 salt 값이다 */
salt[2] = '\0';
}
if(strcmp(pw, crypt(p->pw_name, salt)) == 0)
printf("%s (%s) account detected\n", p->pw_name, p->pw_dir);
}
}
void
err_print(char *err_string)
{
perror(err_string);
exit(EXIT_FAILURE);
}Forums:


댓글 달기