-
Notifications
You must be signed in to change notification settings - Fork 62
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
비밀번호 암호화 방법 개선 #889
Comments
사실 보안이 굉장히 중요한 요소중 하나이기 때문에 이런 이런 움직임은 굉장히 가치있다고 생각합니다. |
며칠까지 걸릴 것도 없을 것 같습니다. XE가 워낙 깔끔하게 디자인되어 있어서, 몇 군데만 고치면 나머지는 모두 따라오네요. 위의 1~7번에 해당하는 작업은 일단 마쳤습니다. 관리 페이지에서 설정 하나만 바꿔주면 기존에 현재 진행 상황은 https://github.com/kijin/xe-core/tree/feature/pwhash 에서 보실 수 있습니다. 아직 몇 가지 부족한 부분이 있어 풀리퀘를 넣지 않고 있습니다.
|
보안 기능만 잘돼도 XE를 선택하고 사용하는 사용자들이 늘어날 것 같네요. |
어제 아직 부족하다고 말씀드렸던 부분들에 대한 업데이트입니다.
우선 60자의 제한 안에서도 문제없이 다양한 암호화 알고리듬들을 사용할 수 있도록 하였습니다. 예를 들어 sha256의 경우 해시값이 64바이트이지만, 60바이트에서 잘려버린 경우에는 처음 60바이트만 비교하여 통과시켜 주는 식입니다. (잘리지 않은 경우에는 끝까지 비교합니다.) 물론 이 상태로 계속 사용한다면 최고의 보안을 누릴 수는 없겠지만, 가장 강력한 보안을 제공하는 pbkdf2와 bcrypt는 60자 이내에서도 사용이 가능하므로 sha256을 최대한 활용하지 못한다고 해서 크게 아쉬운 것은 없습니다. 어차피 솔트가 없는 알고리듬들은 다 거기서 거기입니다.
기존 소스의 일단 서버의 비트수에 따라 올바른 함수를 선택하도록 조치하였습니다. 사실 구 제로보드 회원DB를 그대로 가져온 경우를 제외하면 PHP 5.2 환경 테스트 부족 가상서버에서 CentOS 5.10, PHP 5.2.17 환경을 구축하여 테스트해본 결과, bcrypt를 제외한 모든 알고리듬들이 정상 동작하는 것을 확인하였습니다. 주말인데다 휴가철이라 다른 개발자분들이 별로 계시지 않아 다소 아쉽습니다만, 조금 더 테스트해 보고 pull request를 넣도록 하겠습니다. 더 고쳐야 할 부분이 있다면 일단 풀리퀘 넣고 나서 고쳐도 되겠지요. |
다른 모듈들과의 호환성 점검 결과입니다. 회원 비번 암호화 알고리듬만 개선하고, 게시판이나 방명록의 글·댓글 등에 비회원이 입력한 비번에는 어떠한 부작용도 일으키지 않는 것이 목적입니다. 문서 (document) 및 댓글(comment) 모듈 : 비회원이 쓴 글·댓글의 비번을 저장할 때는 게시판 (board) 모듈 : 저장할 때는 문서와 댓글 모듈을 그대로 사용하므로 그러나 제가 고친 위키 (wiki), 지식인 (kin), 포럼 (forum), 카페 (cafe) 모듈 : 게시판과 동일합니다. 방명록 (guestbook) 모듈 : 글을 저장할 때와 확인할 때 모두 텍스타일 (textyle) 모듈 : 게시판과 동일합니다. 업글타일 (upgletype) 등 텍스타일 기반으로 만들어진 다른 모듈들도 마찬가지입니다. 단, 방명록 기능은 다른 분들이 만든 모듈 : XE 자료실에서 아약스보드 (ajaxboard), xiso 게시판 확장모듈, xiso 회원관리 확장모듈, 닉네임 변경 관리모듈, 누리고 비번찾기모듈, 로그인 기록모듈 등을 확인해 보았습니다. 모두 기존의 게시판이나 회원관리 모듈을 확장할 뿐, 비번 암호화와 관련된 부분을 직접 건드리지는 않으므로 문제 없습니다. 비번 확인시에는 자체적으로 처리하지 않고 |
풀리퀘 넣었습니다. 변경한 부분에 대한 자세한 설명도 함께 적었습니다. #894 |
#894 에서 처리하고 이슈는 닫도록 하겠습니다. |
안녕하세요? 약 6년째 XE를 사용하고 있는 프로그래머입니다.
전에도 공식사이트 게시판에서 몇 차례 이와 관련된 논의가 있었던 것으로 기억하는데, 현재 XE의 비밀번호 암호화 방식은
md5($password)
또는md5(sha1(md5($password)))
둘 중 하나를 선택하도록 되어 있어서 개인정보보호법 기준에 맞지 않는 것은 물론, 만약 DB가 유출될 경우 레인보우 테이블을 사용하여 쉽게 비밀번호를 유추할 수 있는 형편입니다.예전에는 PHP 4 호환성을 위해 어쩔 수가 없었지만, XE 1.7부터는 반드시 PHP 5.2.4 이상을 사용하도록 하고 있기 때문에 더이상 예전 방식을 유지할 필요가 없다고 생각합니다. 요즘 뜨는 bcrypt까지는 아니더라도, 국제 표준인 PBKDF2 (HMAC-SHA256) 알고리듬 정도는 PHP 5.2.4에서도 충분히 사용이 가능하니까요. 그것조차 지원되지 않는 서버라면 최소한 솔트 정도는 넣어야겠죠.
그래서 좀더 다양한 비밀번호 암호화 방법들을 선택할 수 있도록 제가
member
모듈을 좀 수정해 보려고 합니다. 비슷한 작업을 몇 차례 해본 경험이 있거든요.현재 계획은 다음과 같습니다.
db.config.php
에 저장되도록 합니다.member
모듈에서 기존의$useSha1
변수가 수행하던 기능은 이것으로 대체합니다.md5()
,md5(sha1(md5())), MySQL의
password()및
old_password()` (여기까지는 기존에 사용하던 알고리듬들), SHA256, SHA512, MD5+솔트, SHA1+솔트, SHA256+솔트, SHA512+솔트, PBKDF2, 그리고 PHP 5.3.7 이상인 경우 bcrypt로 합니다.member.model.php
를 수정하여 위와 같은 알고리듬으로 암호화된 비번도 체크할 수 있도록 합니다.$useSha1
을 사용할 경우 다시 암호화하는 방식과 유사합니다. 단, 다른 프로그램과의 호환성을 위해 일부러 예전 알고리듬을 사용하기를 원하는 경우 다시 암호화하지 않도록 하는 옵션을 추가하는 것도 고려해 보아야겠습니다.)member.controller.php
를 수정하여 신규 회원가입, 회원정보 변경, 비번 변경, 비번 리셋 등의 경우에도 위에서 설정한 것과 동일한 알고리듬을 사용하도록 합니다.member
테이블의password
필드는 현재 60자밖에 되지 않아 SHA512, PBKDF2 등 일부 알고리듬의 해시값을 저장하기에 충분하지 않습니다. 이것을 250자로 늘려서 추후 어떤 알고리듬이라도 넉넉하게 사용할 수 있도록 합니다.classes/security
폴더에Password.class.php
라는 파일을 새로 만들어도 될까요?모듈이나 애드온으로 만들어 배포하지 왜? 라고 생각하시는 분도 있겠지만, 회원의 개인정보 보호는 워낙 중요한 문제인데다가 비번 암호화는 원래 XE Core에서 담당하는 부분이기 때문에 XE Core 자체를 수정하지 않으면 개선하기 어렵습니다. XE 마켓에서 회원관리 확장 기능을 제공하는 모듈들을 봐도, 절대 다수가
member
모듈을 상속받아 사용할 뿐, 비번 암호화 관련 기능을 직접 구현하지는 않고 있습니다.비번 암호화 방법 개선에 더하여 아래와 같은 기능도 구현할 수 있겠으나, 일단 중요한 것이 아니고 다른 모듈과의 호환성이 더 복잡해질 수 있으므로 미루어 두겠습니다.
우선 작업을 해서 며칠 안에 pull request를 넣도록 하겠습니다.
건드리는 부분이 많다 보니 당장 XE Core에 포함시키기에는 어렵겠지만, XE 1.8에는 강력한 비밀번호 암호화 기능이 꼭 포함되었으면 좋겠습니다. 코어 개발자 분들의 꼼꼼한 검사와 꾸지람, 많은 테스트를 부탁드리며, 제가 적은 것보다 더 좋은 아이디어가 있으시다면 얼마든지 댓글 달아 주세요.
성기진 @kijin 올림
The text was updated successfully, but these errors were encountered: