CI 묻고 답하기

제목 [해결]로그인 처리에 대한 질문
글쓴이 쿠사 작성시각 2014/12/23 18:30:18
댓글 : 11 추천 : 0 스크랩 : 0 조회수 : 14271   RSS
현재 로그인 처리가
로그인폼에서 아이디와 비밀번호를 입력하면
회원테이블에서 아이디에 해당하는 비밀번호를 불러와서 decode한 후에
컨트롤러에서 아이디와 비밀번호를 비교한 후 일치여부를 확인하도록 설계가 되어있는데
만약 다른회원의 아이디와 비밀번호를 입력하고 로그인을 했을때 다른회원의 비밀번호가
컨트롤러로 불려와지게 될 것 같은데 이렇게 처리하는게 보안상 문제는 없는건가요?
 다음글 [해결]로그인처리 세션문제..(내용수정) (8)
 이전글 [완료] 안녕하세요. mysql 셋팅에 따른 ci db... (5)

댓글

변종원(웅파) / 2014/12/23 18:37:47 / 추천 0
잘못된 로직입니다. 입력받은 비밀번호를 하여 암호화되어 저장된 비밀번호랑 비교해야 합니다
쿠사 / 2014/12/23 19:25:25 / 추천 0
변종원(웅파) // 무슨말씀인지 잘 모르겠습니다.. 입력받은 비밀번호를 하여? 가 무슨의미인지..
이미 저장된 비밀번호는 암호화되어 저장되어있어서 입력을 받은 비밀번호를 암호화했을때는 같은결과가 안나올거같은데
이미 암호화되어있는 비밀번호를 복호화 하는 방법 이외에 다른방법이 있나요?
leese / 2014/12/23 19:34:06 / 추천 0
폼으로 입력받은 비밀번호를 암호화해서  회원테이블에서 가져온 암호와 비교하세요.

 
쿠사 / 2014/12/23 20:00:25 / 추천 0
leese // 제가 초보라서그런데 폼으로 입력받은 비밀번호를 암호화하면 저장되어있는 암호와 같은 결과가 출력되나요?

같은 문자를 입력하고

$this->encrypt->encode($this->input->post('user_pw')) 와 같이 echo로 출력해보면
실행할때마다 다른 문자열들이 출력되는것같은데...
 
leese / 2014/12/23 20:07:21 / 추천 0
md5 함수 이용하세요.

회원가입때 받은 암호를 md5($this->input->post("password")) 해서 저장하고..

로그인시에 받은 암호를 똑같이 md5($this->input->post("password")) 해고 디비에 있는 값가져와서 비교
쿠사 / 2014/12/23 20:27:28 / 추천 0
leese // 답변 감사합니다.
그런데 회원가입때
1. form_validation에서 'rules'=>'trim|required|min_length[6]|max_length[20]|md5' 와 같이 처리
2. 회원모델에서 'user_pw'                => $this->encrypt->encode($this->input->post('user_pw')), 와 같이 실행
3. 을 하니 db에는 fDvIBVnzV2ZnxZpW 와 같은 비밀번호가 저장.
4. 로그인폼에서 동일 비밀번호를 입력
5. encode할때마다 같은비밀번호를 입력해도 다른 문자열이 생성됨

아 쓰다보니 궁금한점이 생겼는데 제소스에서 md5도 하고 edcode도 하는거 같은데 원래는 이렇게 할필요가 없이 그냥
md5만 한 다음에 'user_pw'                => $this->encrypt->encode($this->input->post('user_pw')), 이런식으로 할 필요없이
'user_name'                => $this->input->post('user_pw'), 이런식으로만 하면 되는건가요?
초보라서 너무 기초적인것들을 질문하는것같네요.... 일단 encode와 md5를 좀 찾아보고있어야겠습니다.....
쿠사 / 2014/12/23 20:43:25 / 추천 0
form_validation에서 |md5로 하면 md5로 비밀번호가 변환되는거 아닌가요?
그렇게 하고 회원모델에서 그대로 'user_pw'                => $this->input->post('user_pw'), 이렇게 저장을 하니
b990a1577e88882a 이런식으로 저장이 됩니다.
이 후에 불러온 db의 값(b990a1577e88882a)과 로그인폼에서 입력한 비밀번호(마찬가지로 form_validation에서 md5)를 비교하려고 했는데 로그인폼에서 새로 입력한 비밀번호를 출력해보니 저장된 b990a1577e88882a 이외에 43f26b232d85632b 라는 값이 더 붙는것같은데 음....
변종원(웅파) / 2014/12/23 21:18:34 / 추천 0
암호하하여 인데 안나왔네요. 로직은 leese님이 잘 설명해주셨네요.
비밀번호는 복호화되면 안됩니다.

비밀번호 필드 길이가 짧아서 짤리는거 아닌가요?
쿠사 / 2014/12/23 21:24:52 / 추천 0
변종원(웅파) // 아 제가 초보라서 실수를 했네요;;;
비밀번호 필드가 짧아서 DB에 잘려서 저장되는게 맞습니다;;
그리고 암호화한걸 복호화하면 입력했던 비밀번호가 그대로 출력되야 된다고 착각하고있었네요;;; 절대알면안되는건데;
이제 대충은 이해를 했습니다. 그런데 아직 의문이 남아있는데
기존 코드에서는 md5를 한다음에 encode까지 해서 db에 저장을 하던데 md5만 해도 상관이없는건가요?
그리고 구글링을 해보니 md5방식은 보안에 취약하다고 하던데
일반적인 사이트의 경우에는 md5방식을 많이쓰는 편인가요? 아니면 다른 대충화된 암호화방식이 있는지.. .궁금합니다..
변종원(웅파) / 2014/12/23 22:15:15 / 추천 0
암호화 검색해보시면 방식 많이 나와요. php.net에서 암호화 함수 찾아보셔도 되구요.

포럼 소스의 암호화 방식도 참고해보세요. tank_auth라는 회원모듈인데 phpass라는 암호화 라이브러리를 사용합니다.

제가 알기로 md5가 취약하다는건 1234 같은 또는 사전에 들어있는 단어들을 비밀번호로 했을 경우 
툴로 단순비교하는것에 뚫린다는 겁니다. 비밀번호 해킹툴이 1234 또는 사전단어를 md5해서 로그인해보는 식으로
처리하는데 의외로 간단한 비밀번호를 쓰는 사람이 많아서 그런걸로 압니다.
쿠사 / 2014/12/23 22:18:44 / 추천 0
변종원(웅파) //  일단은 md5와 함께 encode를 해서 처리를 해놓았는데 전체적인 흐름을 좀 더 알게되면 깊이있게 공부해보아야겠습니다. 답변 감사합니다~