메뉴 건너뛰기

프로그램언어

조회 수 19972 추천 수 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
번호 제목 날짜 조회 수
180 while, for, foreach 속도 비교 2021.03.26 620
179 utf-8 문자열을 주어진 바이트로 자르기 2019.04.29 1356
178 TIME_TO_SEC 시간 포맷 2019.01.16 1381
177 TIFF, GIF 여러장 변환 file 2021.03.26 323
176 text파일에 한줄씩 내용추가하기 2017.03.06 17535
175 Text를 GD 이미지로 뿌리기 2014.02.27 29813
174 substr(), mb_substr(), iconv_substr() 2021.03.26 564
173 stripslashes — 따옴표 처리한 문자열을 풉니다 2016.12.23 20486
172 stripcslashes — addcslashes()로 인용한 문자열을 되돌림 2016.12.23 20442
171 RSSReader Class 제작 및 Reader 만들기 file 2016.08.22 21042
170 RSS json_decone 사용방법 2019.01.16 1430
169 Record Drag/Drop Position 2014.02.27 29201
168 quotemeta 모든 메타 문자앞에 역슬래쉬를 붙인 문자열을 반환 2016.12.23 20461
167 printf() sprintf() 2021.03.26 272
166 preg_match (정규표현식 매치를 수행합니다) 2016.12.23 20843
165 Predefined Variables (미리 정의된 변수들) 2021.03.26 274
164 POST값 통째로 인코딩하기 1 2015.04.06 21175
163 POST, GET으로 배열값 받기(직렬화) file 2017.03.06 23285
162 php한글체크를 위한 정규표현식 2014.04.12 22458
161 PHP폼 사용시 폼 양식에서 값이 사라질때 2019.01.08 1316
Board Pagination Prev 1 ... 4 5 6 7 8 9 10 11 12 13 ... 17 Next
/ 17

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved