BOARD

문제 해결

PHP 버전 업그레이드에 따른 mcrypt 암호화 함수 openssl 마이그레이션 방법

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 29회 작성일 26-09-12 18:03

본문

PHP 버전 업그레이드에 따른 mcrypt 암호화 함수 openssl 마이그레이션 방법

PHP 버전 업그레이드로 인해 발생한 mcrypt 함수 오류를 openssl 기반의 AES-128-CBC 방식으로 안전하게 마이그레이션하는 방법을 안내합니다.

PHP 버전과 mcrypt 함수 사용 여부 확인 방법

PHP 7.1.0 버전부터 mcrypt 함수군은 더 이상 권장되지 않으며, PHP 7.2.0 버전부터는 완전히 제거되었습니다. 따라서 기존에 mcrypt 함수를 사용하던 코드는 PHP 7.2 이상 환경에서 치명적인 오류를 발생시키므로 사전에 버전을 확인하고 점검해야 합니다.

1. 서버 PHP 버전 확인

  • 명령줄(CLI) 환경: 서버에 SSH 등으로 접근이 가능하다면 터미널에 php -v를 입력하여 확인할 수 있습니다.
  • 웹 환경: 웹 서버가 호출하는 PHP 버전은 CLI 버전과 다를 수 있습니다. 서버 설정을 알 수 없거나 접근이 제한된 경우, PHP 파일 내에 <?php echo phpversion(); ?>을 작성하여 웹 브라우저에서 직접 확인하거나, phpinfo() 함수를 호출하여 상세 환경을 점검할 수 있습니다.

2. 소스 코드 내 mcrypt 함수 호출 점검

사용 중인 소스 코드 내에서 다음 함수를 호출하고 있는지 점검합니다.

  • mcrypt_encrypt
  • mcrypt_decrypt

PHP 7.2 이상 환경에서는 해당 함수가 존재하지 않으므로, 호출 내역이 발견되면 openssl 확장 모듈을 기반으로 한 openssl_encrypt 및 openssl_decrypt 방식으로 마이그레이션을 준비해야 합니다.

mcrypt 암호화 코드를 openssl로 마이그레이션하는 방법

PHP 7.2 이상 환경에서 제거된 mcrypt 함수 대신 openssl_encrypt와 openssl_decrypt 함수를 사용하여 AES-128-CBC 방식으로 양방향 암호화 및 복호화를 수행하도록 코드를 수정할 수 있습니다.

작업 전 준비 사항

  • 코드나 설정을 변경하기 전 기존 파일을 반드시 백업하여 원상 복구할 수 있는 준비를 갖춘 뒤 작업을 진행합니다.
  • PHP 5.x 환경과 PHP 7.x/8.x 환경 간에는 함수 인자 전달 순서가 달라질 수 있으므로 파라미터 위치를 검토하여 구현해야 합니다.

구현 예시 코드

아래의 함수 정의 및 변환 코드를 참고하여 프로젝트에 적용합니다.

if (!function_exists('hex2bin')) {
    function hex2bin($hexdata) {
        $bindata="";
        for ($i=0;
        $i < strlen($hexdata);
        $i+=2) {
            $bindata.=chr(hexdec(substr($hexdata,$i,2)));
        }
        return $bindata;
    }
}

if (!function_exists('toPkcs7')) {
    function toPkcs7 ($value) {
        $padSize = 16 - (strlen ($value) % 16);
        return $value . str_repeat (chr ($padSize), $padSize);
    }
}

if (!function_exists('fromPkcs7')) {
    function fromPkcs7 ($value) {
        $valueLen = strlen ($value);
        if ( $valueLen == 0 ) $value = "";
        $padSize = ord ($value{$valueLen - 1});
        if ( ($padSize < 1) or ($padSize > 16) ) $value = "";
        for ($i = 0; $i < $padSize; $i++) {
            if ( ord ($value{$valueLen - $i - 1}) != $padSize ) $value = "";
        }
        return substr($value, 0, $valueLen - $padSize);
    }
}

if (!function_exists('encrypt')) {
    function encrypt ($key, $value, $IV) {
        if ( is_null ($value) ) $value = "";
        $value = toPkcs7 ($value);
        $output = openssl_encrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
        return base64_encode ($output);
    }
}

if (!function_exists('decrypt')) {
    function decrypt ($key, $value, $IV) {
        if ( is_null ($value) ) $value = "";
        $value = base64_decode ($value) ;
        $output = openssl_decrypt($value, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $IV);
        return fromPkcs7 ($output);
    }
}

적용 후 점검 사항

  • 기존 mcrypt로 암호화된 데이터를 openssl로 복호화할 경우, 패딩 방식(PKCS7)과 IV 처리 방식이 동일해야 합니다.
  • mcrypt의 MCRYPT_RIJNDAEL_128은 openssl의 AES-128-CBC와 매핑하여 사용할 수 있습니다.
  • 기존 데이터 복호화 시 키와 IV의 호환성을 사전에 테스트해야 하며, 변경 후에는 정상적으로 암호화 및 복호화가 수행되는지 실제 결과 값을 확인합니다.

함께 보면 좋은 글

참고자료

운영 사례·사용자 경험

기타 참고자료

댓글목록

등록된 댓글이 없습니다.