CI 묻고 답하기

제목 정말 초보자질문일것 같은데요 로그인 관련해서 문의 드립니다.
글쓴이 진공발차기 작성시각 2014/10/21 18:20:28
댓글 : 17 추천 : 0 스크랩 : 0 조회수 : 14810   RSS
제가 이번에 프로젝트를 하나 맡게 되었는데 코드이그나이터로 만들어져 있습니다.
그래서 나름 보고 있는데
다름이 아니라 로그인 쪽에서 문제가 발생을 했습니다.

값을 1111을 넣고 전송을 했을 경우

array('field'=>'mb_password', 'label'=>'비밀번호', 'rules'=>'trim|required|md5')
을 통해서 $this->input->post('mb_password');
했을 경우엔 값이 : b59c67bf196a4758191e42f76670ceba 즉 md5(1111) 한 값이 나옵니다.

그런데 중요한거는

$this->load->library('encrypt');
$this->encrypt->decode($mb['mb_password'])
했을 경우에는 값이 a���3|�J=M��nd�3Qb=����Gfܭ:  이렇게 알수 없는 값이 들어가고 있습니다.

그래서 Encrypt.php 파일이 혹시 UTF-8이 아닌가 싶어서 해당 파일도 확인해서 UTF-8로 바꾸었는데도 역시나 값이 그렇게 들어가고 있습니다.

이럴 경우에는 어떤 부분을 보아야 하나요?
 다음글 foreach문.. 라디오버튼 피드백좀 부탁드립니다 꾸... (6)
 이전글 $this->load->library() 인... (3)

댓글

아싸리비아 / 2014/10/21 18:25:00 / 추천 0
md5 와 library('encrypt') 는 다른걸로 보여집니다.
기존 저장된 방식이 md5 라면,  전달받은 password를 md5로 암호화 후 비교해야 맞지 않을까 싶습니다.

또한 현재 비교대상이신 mb_password는 패스워드로 보여지는데. 보통 암호화 방식은 단방향 암호화로
디코딩이 안되는걸 택하셧을텐데.. 암호화 방식을 체크 해보시는게 좋을거 같습니다.
변종원(웅파) / 2014/10/21 18:26:15 / 추천 0
패스워드는 복호화가 되면 안됩니다. 

db에 입력되어 있는 md5된 값과 입력받은 값을 md5한 값을 비교하여 동일하면 로그인되는 것입니다.
진공발차기 / 2014/10/21 18:30:50 / 추천 0
저도 이게 안될꺼라고 생각을 했는데 지금 소스는 제가 이전을 해가지고 와서 테스트 서버에서 진행을 하는 거구 지금 돌아가고 있는 곳에서는 해당 소스가 정상적으로 돌아가고 있더라구요 ㅜㅜ
어떻게 해서 그런 이유가 발생했는지 모르겠지만요.

아래와 같이 써 놓고 이게 작동을 하는게 너무 신기해서 이렇게 문의를 드리게 되었습니다.

$this->load->library('encrypt');
   $mb = $this->Basic_model->get_member($this->input->post('mb_id'), 'mb_id,mb_level, mb_no, mb_kind,mb_password, mb_email, mb_leave_date, mb_email_certify,mb_real_limit ,mb_best_limit,mb_recruit_best_limit,mb_items_limit,mb_icons_limit,mb_today_resume,mb_today_contacts,mb_today_recruit_resume,mb_today_recruit_contacts,mb_today_login');

   if (!$mb || $this->input->post('mb_password') !== $this->encrypt->decode($mb['mb_password']))
    goto_url('member/login/qry/1');

   if ($mb['mb_leave_date'] && $mb['mb_leave_date'] <= date('Ymd', time())) {
    $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1\\2\\3일", $mb['mb_leave_date']);
    alert("탈퇴한 아이디이므로 접근하실 수 없습니다.\\n\\n탈퇴일 : ".$date);
   }

변종원(웅파) / 2014/10/21 18:37:58 / 추천 0
디코딩하기 전 $mb['mb_password'] 변수를 찍어보면 값이 어떻게 나올까요?

 
진공발차기 / 2014/10/21 19:34:19 / 추천 0
그러면
1111 을 md5 한 : b59c67bf196a4758191e42f76670ceba 값이 들어가요.
 
kennjin / 2014/10/22 03:01:39 / 추천 0
md5는 단방향 암호입니다. 반대로 풀수가 없지요.
 
양방향 쓰실려면 코드 이그나이터 인크립션 클래스로 인코딩 시키고 그걸 다시 디코딩 하면됩니다.

md5는 반대로 푸는 방법을 발견하면 현상금이 어마 어마하게 걸려있다는데 아직까지 md5디코딩 하는 방식은 발견되지 않았다고 들었습니다. ^^
한대승(불의회상) / 2014/10/22 04:26:48 / 추천 0
어쩌면 md5 한걸 다시 encrypt 했는지도 모릅니다.
application/config/config.php
$config['encryption_key'] = '설정된키';
항목이 테스트서버와 이전서버가 동일한지 확인해 보세요.
 
진공발차기 / 2014/10/22 09:07:22 / 추천 0
한대승(불의회상) 해결된줄 알았는데 아니네요. ㅜㅜ 이게 복사를 해가지고 와서 그대로 소스가 똑간구요
config.php 파일에서 $config['base_url'] = '도메인 주소';

이것만 바꿨습니다.
$config['base_url'] =  "도메인명/';

 
진공발차기 / 2014/10/22 09:18:23 / 추천 0
계속 이것저것 찾다가 저랑 같은 현상이 있었던 분을 찾았네요.
주소가 : http://codeigniter-kr.org/qna/view/7823/page/42/ 이거이며 아마 이문제 일꺼라는 생각이 가장 크네요.
근데 mcrypt <-- 이걸 뭐라고 읽나요?
한대승(불의회상) / 2014/10/22 09:22:26 / 추천 0
전공발차기// 그러고 보니 2.2.0 부터 encrypt 부분이 바뀌었네요. 
코드이그나이터 버젼을 확인한후 같은 버전으로 설치 해서 테스트 해보세요 ^^

어쩌면 PHP 버전까지 확인해야 하는 불상사가 일어날지도....
진공발차기 / 2014/10/22 10:59:20 / 추천 0
코드이그나이터는 파일 자체를 가져와서 했기 때문에 아마 똑같은 버전이라고 생각이 들어요 ^^
다만 내용을 확인하다 보니까 신규로 테스트하고 있는 서버에 phpinfo를 확인해 보니
버전이 : Version 5.3.13p1
configure 부분에는 : '--with-mcrypt' ' 이 있고 
기존 서버에는 버전이 : PHP Version 5.2.6 이며
configure mcrypt 부분이 없었습니다.
이것 때문에 기존 서버는 되고 신규서버는 안되는거 아닌가 싶기도 한데요 이거를 어디서 부터 어떻게 찾아야 하는지 모르겠습니다.

일단 기존 서버는 :
$this->input->post('mb_password') 
$this->encrypt->decode($mb['mb_password'])
값이 모두 : b59c67bf196a4758191e42f76670ceba 나오고 있으며

신규 서버는
$this->input->post('mb_password') 
$this->encrypt->decode($mb['mb_password'])
값이 위에꺼는 b59c67bf196a4758191e42f76670ceba
밑에꺼는 닶이 a���3|�J=M��nd�3Qb=����Gfܭ 나오고 있습니다.




 
들국화 / 2014/10/22 11:25:40 / 추천 0
신규서버에는 mcrypt가 설치되었고 그래서 mcrypt 를 이용해서 그렇케 되는것 같습니다.
decode가 불필요할것 같은데... 빼시거나... mcrypt 를 로딩안되게 php.ini를 수정하면 될것 같습니다.
들국화 / 2014/10/22 11:52:59 / 추천 0
메뉴얼을 보면 mcrypt가 설치가 되어 있으면 이용을 하고 없으면 XOR 인코딩을 사용한다고 나와 있네요.
진공발차기 / 2014/10/22 13:07:11 / 추천 0
//들국화
그러면 소스를 가지고 사용을 하게 되었을 경우에는 저장되어 있는 패스워드들은 mcrypt 가 설치가 안되어 있는 서버에서 사용해야 한다는 이야기네요.
안그러면 해당 패스워드는 XOR인코딩을 사용했기 때문에 XOR디코딩을 해야 하는 거구요. ㅜㅜ
들국화 / 2014/10/22 13:43:29 / 추천 0
진공발차기//
윗분들도 적으셨지만 MD5는 디코딩이 안됩니다. 좀 특수한 상황에서 보안성이 깨진걸로 나오기는 하지만 아직도 많이 쓰고 있고 단방향으로 나오는 해쉬함수 입니다.
MD5로 해싱한 값을 왜 디코딩 하는지 이해가 되지 않네요.
보통은 MD5로 암호화 했다면 그값을 그대로 디비에 저장 하고 사용자에게서 입력받은 값을 다시  MD5로 아호화 했을때 값과 비교해서 인증처리 하는 방법입니다.