메뉴 건너뛰기

프로그램언어

조회 수 19965 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

PHP의 Mcrypt 라이브러리


PHP에서 사용할 수 있는 암호화 라이브러리는 매우 많습니다. Mcrypt 라이브러리는 그 중 하나에 해당되는 라이브러리입니다. 일반적으로 웹 프로그래밍에서 자주 사용되는 암호화 기술들은 복호화가 불가능한 것들이 많습니다. PHP에서 암호화를 할 때 자주 사용되는 md5() 함수라든지 MySQL의 password() 함수는 모두 복호화가 불가능한 암호화 알고리즘입니다.

복호화가 불가능한 암호화 알고리즘은 주로 패스워드를 암호화할 때 사용됩니다. 왜냐하면 패스워드는 복호화를 해야 하는 필요성이 없는 매우 민감한 개인 정보이기 때문입니다. 로그인 처리를 할 때에는 사용자가 입력한 패스워드를 암호화 한 후에 데이터베이스에 저장된 암호화된 패스워드와의 일치 여부만 확인하면 됩니다. 패스워드는 복호화가 되지 않으므로, 사이트 관리자도 사용자의 패스워드를 알 수 없습니다. 따라서 사용자가 패스워드를 분실했을 때에는 사이트 관리자가 패스워드를 알려주는 것이 아니라 해당 사용자의 패스워드 초기화 하는 것입니다.

하지만 Mcrypt 라이브러리는 복호화가 가능한 암호화 라이브러리입니다. 데이터를 암호화 했다가 다시 복호화하여 원본 데이터를 그대로 확인할 수 있는 것이죠. 관리자 이외의 사람들이 보면 안 되는 보안이 필요한 데이터를 일반 파일이나 데이터베이스에 저장할 때 Mcrypt 라이브러리를 활용하면 됩니다. 이렇게 암호화된 데이터는 나중에 다시 사용될 수 있으니, 웹 프로그램의 설정 파일이나 기본 데이터 파일 등을 안전하게 저장할 필요성이 있을 때 Mcrypt 라이브러리를 사용하면 매우 좋습니다. 이 글에서 소개하는 암호화/복호화 소스코드는 Mcrypt 라이브러리를 활용한 소스코드입니다.

암호화/복호화 클래스 소스코드


저는 Mcrypt 라이브러리를 활용하여 다음과 같은 소스코드를 만들어보았습니다. 이 소스코드는 암호화와 복호화를 매우 간단하게 구현해주는 클래스 소스코드입니다. 그냥 자신이 현재 개발하고 있는 웹 프로그래밍 프로젝트에 아래의 소스코드를 포함하고 있는 파일만 require 하면 바로 사용할 수 있습니다. 클래스로 구현하였기 때문에 타 소스와의 충돌이 전혀 발생하지 않습니다. 또한 싱글톤 패턴으로 작성되었기 때문에 프로젝트 내에서 단 한 번만 불러오면 되므로 사용할 때에도 매우 편리합니다.

암호화 또는 복호화를 하려면 이 클래스를 프로젝트에 require 한 후에 encrypt() 메소드와 decrypt() 메소드를 사용하면 됩니다. 클래스 소스코드 중간에서 볼 수 있는 setIv() 메소드는 Mcrypt 라이브러리에서 암호화를 할 때 꼭 필요한 IV 값을 생성하는 메소드입니다. 이 메소드는 이 클래스를 로드할 때에만 딱 한 번 실행되어야 합니다. 그 이후에는 이 메소드를 다시 실행하지 않아도 정상적으로 암호화 또는 복호화할 수 있습니다. 만약 좀 더 편리하게 클래스를 수정하고 싶다면, setIV() 메소드를 __construct() 메소드에 포함시켜도 됩니다.

※ 사용 예제는 소스코드 하단에 있습니다.
final class EES {
 
    protected static $_instance = NULL;
    protected $_key_size = NULL;
    protected $_key = NULL;
    protected $_iv = NULL;
    protected $_iv_size = NULL;
    protected $_fixed_iv = NULL;
     
    protected function __construct ()
    {
        $this->_key = pack('c*', base64_encode('http://www.erzsamatory.net'));
        $this->_key_size = strlen($this->_key);
        $this->_fixed_iv = base64_decode('pZxBk2nYByDM0H7NqhvIlPnVgc2yDTHiDGlV2T69uhE=');
    }
     
    public static function getInstance ()
    {
        if (self::$_instance === NULL) {
            self::$_instance = new self();
        }
         
        return self::$_instance;
    }
     
    public function setIv ($iv = '')
    {
        if (!$iv) {
            $this->_iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
            $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
        } else {
            $this->_iv = base64_decode($iv);
        }
         
        return $this;
    }
     
    public function encrypt ($text)
    {
        $temp = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->_key, $text, MCRYPT_MODE_CBC, $this->_iv);
        $temp = serialize(array($temp, $this->_iv));
        $temp = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->_key, $temp, MCRYPT_MODE_CBC, $this->_fixed_iv);
        return $temp;
    }
     
    public function decrypt ($encrypted_text)
    {
        $temp = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->_key,
                        $encrypted_text, MCRYPT_MODE_CBC, $this->_fixed_iv);
        $temp = unserialize($temp);
        $temp = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->_key, $temp[0], MCRYPT_MODE_CBC, $temp[1]);
        return $temp;
    }
}

require_once 'EES.class.php';
echo ($encrypted = EES::getInstance()->setIv()->encrypt('안녕하세요? 황민식입니다.')).'<br />';
echo EES::getInstance()->decrypt($encrypted);



※ 위의 소스코드는 개발중인 소스코드이기 때문에 오류가 발생할 수 있습니다. 이 점 꼭 유의해주시기 바랍니다.

List of Articles
번호 제목 날짜 조회 수
260 13자리 timestamp 생성하기 file 2020.09.28 649
259 cUrl를 이용한 json 데이타 주고 받기 2020.09.28 1253
258 Javascript 두 좌표 사이의 거리 구하기, 두 좌표의 중앙 좌표 구하기 file 2020.09.23 535
257 네이버 지도 API를 이용한 주소를 좌표로 변환하기 (PHP) 2020.09.22 490
256 사업자등록번호 유효성 체크 2020.08.24 470
255 멀티 파일다운로드 꽁수로 구현하기 2020.06.19 437
254 파일 다운로드 함수(멀티 이어받기/속도제한) 2020.06.19 618
253 다중 파일을 zip으로 묶어받기 2020.06.19 616
252 사진이 회전되서 올라갈 경우 2020.05.25 766
251 PHP 버전이 낮아 imagerotate() 함수가 없을때 대신 사용하는 함수 2019.12.31 644
250 PHP 외부 XML 파싱 하기 2019.06.24 1942
249 주간단위 시작일에서 종료일을 셀렉트박스로 만들기. file 2019.04.29 1331
248 utf-8 문자열을 주어진 바이트로 자르기 2019.04.29 1356
247 PHP $_SERVER 함수 2019.02.25 1558
246 PHP에서 UTF와 EUC-KR 변환 2019.02.19 1553
245 PHP 가변변수 $$ file 2019.02.19 1449
244 PHP http 를 https 로 전환(redirect), http->https 2019.02.19 2181
243 input 자동완성기능 끄기 2019.02.19 1217
242 dddotag - 허용하지 않는 태그 걸러내기 2019.01.16 1850
241 애니메이션 gif 와 일반 gif 구분 하기 2019.01.16 1313
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 17 Next
/ 17

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved