[질문] 소켓통신의 데이터베이스 쿼리에서 패스워드 처리문제 그리고....
회원 아이디와 패스워드를 입력받아 소켓으로 서버에 전송한후 회원인증 하는 프로그램입니다.관련되는 내용 같아서 2개의 질문으로 나누어 올립니다.
[질문1]아래 쿼리문에서 WHERE 조건문에 패스워드인 mb_password 의 암호화 때문인지 쿼리가 되질 않습니다.
#define SEARCH_QUERY "SELECT mb_id, mb_name FROM `rg_member` WHERE `mb_id` = '%s' and `mb_password` = '%s'"
쿼리문중 직접 콘솔에서 MYSQL DB에 들어가 아래와같이 쿼리문을 날려도 패스워드의 암호 때문인지 않됩니다.
SELECT mb_id, mb_name FROM `rg_member` WHERE `mb_id` = 'kim200702' and `mb_password` = 'kim1004';
그런데 아래와같이 콘솔에서나 프로그램상에서나 암호화된 패스워드를 직접 넣으면 잘 되거든요.
SELECT mb_id, mb_name FROM `rg_member` WHERE `mb_id` = 'kim200702' and `mb_password` = '6cf39a60622ce6fc';
물론 패스워드 없이 아이디 하나만 가진 조건문에서는 아무런 문제없이 잘 됩니다.
이럴경우 아래 쿼리문에 패스워드를 어떤방식으로 입력을 해야 되는지 모르겟군요.
암호화 복호화문제는 거의 문외한이라 저로서는 난감하기 이를데 없군요.
관련부분 소스
// 쿼리 정의 #define SEARCH_QUERY "SELECT mb_id, mb_name FROM `rg_member` WHERE `mb_id` = '%s' and `mb_password` = '%s'" // 변수정의 struct user { char mb_id[25]; char mb_name[25]; char mb_password[25]; }rg_member; ..... ..... ........ // 데이터 베이스 초기화 conn_mysql() void conn_mysql(){ mysql_init(&mysql); conn = mysql_real_connect(&mysql,MYSQL_HOST,MYSQL_USER,MYSQL_PWD,MYSQL_DB,0,0,0); if(conn == NULL){ fprintf(stderr,"데이터 베이스 연결 실패 %s\n",mysql_error(&mysql)); exit(1); } ........ ....... ........... // 입력 받은 데이터를 이용 쿼리를 생성 sprintf(qbuf, SEARCH_QUERY, mid, midp); if(mysql_query(conn,qbuf)){ fprintf(stderr,"질의 실패 %s\n",mysql_error(conn)); exit(1); } // 질의를 한 결과를 출력한다. res = mysql_store_result(conn); row = mysql_fetch_row(res); memset (mesfb, 0, 10); printf("디비 쿼리 결과; %d", row); ........... .... ......
[질문2]
키 입력값이 영문 대문자든 소문자든 구분이 되지않은데 왜 그런가요.
아이디가 kim200702처럼 소문자인데 KIM200702 라고 대문자로 입력돼도 똑같이 먹혀들어 갑니다.
이럴경우 어떻게 조치해야 하는지도 아울러 알고 싶습니다.
참고로 서버는 리눅스 레드햇 9 이며 mysql 데이터 베이스 입니다.
sql 데이터 베이스는 쿼리문 조건절에 ascii()를 사용하면 해결된다고 하는데 mysql에서는
않되는군요.
선배님들 도움좀 주시면 감사하겠습니다.
이것 때문에 어제 날밤 새웠습니다.
1번..
mb_password 필드에 값을 넣을때 password('입력할암호') 로 저장하신다면
쿼리문에서도 동일하게 하시면 됩니다.
SELECT mb_id, mb_name FROM `rg_member` WHERE `mb_id` = '%s' and `mb_password` = password('%s')
이런식이 될듯하네요.
실제 데이터가 암호화 되어 저장되어 있기때문에
비교할 조건에서도 암호화 한 다음 비교하셔야 될겁니다.
두번째 질문은 어떤 뜻인지 잘 모르겠네요.
sql 문에서 where name='ttt' 와 where='TTT' 의 결과가 같다는 말이신지?
mysql 4.1.20 에서 테스트 해본 결과는 대소문자를 구별하네요.
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
-----
이글을 읽는 모든 이에게 평화가 함께 하기를... ^^;
감사합니다. 덕분에 잘 해결 되었습니다.
답변 정말 감사합니다.
알려주신 방법대로 하니 문제 없이 잘 됩니다.
근데 그 생각이 도무지 나지를 않는겁니다.
그래서 편견과 외고집이 무서운 거군요.
아!! 이 돌대가리...
다시 한번 감사드립니다.
===============================
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
댓글 달기