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

본문
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_encryptmcrypt_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의 호환성을 사전에 테스트해야 하며, 변경 후에는 정상적으로 암호화 및 복호화가 수행되는지 실제 결과 값을 확인합니다.
함께 보면 좋은 글
참고자료
운영 사례·사용자 경험
기타 참고자료
- 이전글PHP 7.2 이상 버전 each() 함수 오류 해결 및 foreach 대체 방법 26.09.12
- 다음글그누보드 모바일 테마 tail.php 및 CSS 수정 경로 26.09.12
댓글목록
등록된 댓글이 없습니다.