GR Board 2 Documents

[유용한팁] GR BOARD 암호화 변경하기 (md5+sha1)

이동규
  • homepage
  • 2011.07.31 01:44:23
  • hit: 4079
  • good: 8
경고 :
이 문서는 GR BOARD만을 사용하는 분들만 적용하셔야 합니다.
타 시리즈(GR Forum등 연동되는 시리즈)와 사용할 경우, 해당 시리즈의 로그인 처리과정도 수정해야 정상 작동됩니다.


네이트 사태와 더불어 사실 현재 적용되고 있는 GR Board 의 암호화방식도 안전한 것은 아닙니다.
기존에 적용하던 old_password 방식보다 안전한 mdr5 (네이트에서 사용한 방식이지만 안전하지 않죠;) 와 sha1을 이용해 이중 암호화 적용을 하는 방법을 알려드리겠습니다.

일단, 위 경고처럼 다른 연동된 솔루션을 사용하시는 분들은 추가 작업을 해주셔야 정상 작동이 가능하며
순수 GR BOARD사용자분들 또한 새로 업데이트된 파일을 덮어 씌울 때마다 이 TIP을 적용해야 하기 때문에 추천해드리지 않습니다.

이 TIP을 적용할 경우, 회원이 로그인한 상태에서 글을 작성하고 로그아웃 한 후에 해당 게시물을 작성하려고 비밀번호를 입력한 경우에 비밀번호가 일치하지 않는다는 경고메세지가 나타날것입니다.
(이는 아래의 소스를 똑같이 ) enter_password.php 에도 적용하시면 됩니다만, 회원이 로그아웃한 상태에서 글쓸 일은 없기 때문에 알려드리지 않습니다.

그리고, 비회원이 게시물을 작성할 경우 입력하는 암호화는 기존방식 그대로 old_password로 암호화 됩니다.
이는 앞서 말한 바와 같이 직접 소스를 참고하셔서 적용하시면 되겠습니다.




 

 1. login_ok.php 를 열어줍니다.
34번 다음 줄에 (엔터로 위 소스와 아래소스 구분해주는 센스!!) 다음의 소스를 삽입합니다.

    // ID만 미리 빼와 기존 암호화 방식이 password 인지 확인 @이동규
    $member = $GR->getArray("select no, id, password from {$dbFIX}member_list where id = '$id'");
    $psw_num = mb_strlen($member['password'], "UTF-8");
    // password 라면, 기존 방법대로 인증 @이동규
    if($psw_num == 16) {
        $member = $GR->getArray("select no, id from {$dbFIX}member_list where id = '$id' and password = password('$password')");
    }
    // 새로 적용된 암호화 방식이라면, 새로운 방법대로 인증 @이동규
    else {
        $password = md5($password); $password = sha1($password);
        $member = $GR->getArray("select no, id from {$dbFIX}member_list where id = '$id' and password = '$password'");
    }




70번 다음줄에 (이 때도 엔터로 윗 소스와 아랫 소스를 구분합니다. - 다음부턴 설명하지 않습니다.) 아래 소스를 삽입합니다.       // 기존 password 암호화된 멤버라면, 새로운 암호화 적용 @이동규
        if($psw_num == 16) {
            $password = md5($password); $password = sha1($password);
            $GR->query("update {$dbFIX}member_list set password = '$password' where no = '".$member['no']."' limit 1");
            echo'<script>alert("'.$member['id'].'님의 암호를 더욱 안전한 방법으로 암호화 하였습니다.nn이 메세지는 처음 암호화적용시에만 나타나며, 다음 로그인부터는 나타나지 않습니다.");</script>';
        }


2. join_ok.php 을 열어줍니다.
기존 178번부터 183번 째 줄의 소스를 아래의 소스로 대체합니다.

// 새로운 암호화 적용
$password = md5($password); $password = sha1($password);

// 여기까지 왔다면 DB 에 등록한다. @sirini
$registerTime = $GR->grTime();
$sqlInsertNewMember = "insert into {$dbFIX}member_list
    set no = '',
    id = '$id',
    password = '$password',



 3. info.php 을 엽니다.
 230번줄의 소스를 아래의 소스로 덮어 씌어줍니다.  if($_POST['password']) {$password = md5($password); $password = sha1($password); $sqlUpdate .= "password = '$password'";}



 


원리는 old_password 의 암호화 글자수는 총 16자 입니다.
로그인시 입력받은 회원 아이디의 DB에 등록된 암호화된 비밀번호의 암호화 글자수를 검사하여,
16자라면 새로운 암호화방식을 적용하고, 16자가 아니면 새로운 암호화방식(md5+sha1)으로 검사하여 로그인을 진행시킵니다.

비밀번호 찾기, 관리자페이지에서 빠른 멤버생성기능에도 위와같은 이중암호화(md5+sha1)을 적용해야 하나,
어차피 login_ok.php에서 새로 암호화를 해주기 때문에 패스했습니다. (원칙적으로는 적용해야 합니다.) 


이 TIP은 제가 프로그래밍과 암호화에대해 배우지 않았고, 실력도 없으므로 SVN에 적용하지 않았습니다. (다른 개발자분들과도 상의해야 하구요..^^;;)
실제로 이렇게 이중암호화를 한다해서 DB를 해킹당했을 경우, 복호화가 쉬운지는 알 수 없습니다.

다만, 저는 안전하다 생각하여 제가 운영하는 사이트에는 이와같이 적용을 했지요~~

또한 GR BOARD의 퍼포먼스 저하가 일어날수 있으므로, 적용하시려는 분들은 신중히 생각하시고 진행하시기 바랍니다~ 
이동규 site 2011.07.31 13:55:12 reply
http://www.parkoz.com/zboard/view.php?id=my_tips&no=14629

salt 를 이용하면, 기존에 해독? 데이터베이스 검색을 피할 수 있습니다!