본문 바로가기
정보기술/일반

PHP old password 문제 (Version 4 에서 5)

by fermi 2007. 8. 19.


출처: http://www.zeroboard.com/4218905


http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzc3MzM3QGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvNi5naWY=

5. 회원정보 이전시, 비밀번호가 맞지 않는 경우가 있습니다.
    이건 마이그레이션 문제가 아니라 php 버젼의 차이입니다.
    정확히 module/member/member_controller.php 의 마지만 함수가 문제입니다.  
    php5 이상은 처리가 되지만... php4 이하에서는 다른 결과를 보입니다.

몇시간동안 구글링해서 4버젼대에서 old password 알고리즘을 찾아냈습니다.
물론, 5버젼에서도 적용 가능합니다~

php 버젼이 4 인 분들은 반드시,
modules/member/member_controller.php 마지막 함수라인을 이렇게 넣어보세요.
확인결과 zb4에서 마이그레이션 후에 로그인 정상작동 됩니다.

        /**
         * @brief mysql old_password 의 php 구현 함수
         * 제로보드4나 기타 mysql4.1 이전의 old_password()함수를 쓴 데이터의 사용을 위해서
         * mysql의 password.c 소스 참조해서 구현함
         **/

    function mysql_pre4_hash_password($password) {
        $nr=0x50305735;
        $nr2=0x12345671;
        $add=7;
        $charArr = preg_split("//", $password);
        foreach ($charArr as $char) {
            if (($char == '') || ($char == ' ') || ($char == ' ')) continue;
            $charVal = ord($char);
            $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
            $nr2 += ($nr2 << 8) ^ $nr;
            $add += $charVal;
        }
        return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
    }

/** 5.0 이상일 경우
        function mysql_pre4_hash_password($password) {
            $nr = 1345345333;
            $add = 7;
            $nr2 = 0x12345671;

            settype($password, "string");

            for ($i=0; $i<strlen($password); $i++) {
                if ($password[$i] == ' ' || $password[$i] == ' ') continue;
                $tmp = ord($password[$i]);
                $nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
                $nr2 += ($nr2 << 8) ^ $nr;
                $add += $tmp;
            }
            $result1 = sprintf("%08lx", $nr & ((1 << 31) -1));
            $result2 = sprintf("%08lx", $nr2 & ((1 << 31) -1));

            if($result1 == '80000000') $nr += 0x80000000;
            if($result2 == '80000000') $nr2 += 0x80000000;

            return sprintf("%08lx%08lx", $nr, $nr2);
        }
**/