메뉴 건너뛰기

프로그램언어

조회 수 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
번호 제목 날짜 조회 수
220 array_slice 배열의 일부를 추출 2016.12.23 20775
219 [PHP] 게시판 글쓰기와 이미지 파일 DB 저장 및 불러오기 예제 2017.02.19 35886
218 PHP에서 데이터를 엑셀(Excel)로 저장 2017.02.19 18428
217 파일업로드 2017.02.19 19352
216 phpexcel을 이용한 PHP로 엑셀파일 읽기와 생성 file 2017.03.06 22787
215 PHPExcel 클래스를 이용해 Excel 2007~2010 의 xlsx 파일 읽기 (100만 행 까지) 2017.03.06 21694
214 CodeIgniter에서 PHPExcel 사용하기 file 2017.03.06 20289
213 PHP로 엑셀 자료 MySQL에 넣기 2017.03.06 17875
212 메일주소의 골뱅이를 그림처리하기 2017.03.06 15508
211 오류 메시지 출력(alert) 및 페이지 이동(refresh) 관련 2017.03.06 18568
210 ajax refresh 시키기(자동리플래쉬) with php file 2017.03.06 23185
209 Ajax로 구연한 실시간 서버시간출력 file 2017.03.06 21031
208 지엠 웹에디터 v1.1 (저작권표시없음)| file 2017.03.06 17109
207 text파일에 한줄씩 내용추가하기 2017.03.06 17533
206 PHP 만년달력 소스 2017.03.06 17063
205 PHP EXCEL export시 시트 이름 지정하여 여러 시트에 데이터 쓰기 2017.03.06 18264
204 PHP의 유동변수!? - $a1 ~ $a2 같은 형식의 변수를 반복문 돌릴때... 2017.03.06 16610
203 PHP에서 Excel 파일을 만들 수 있는 PHPExcel file 2017.03.06 17112
202 php로 db 컨트롤 1 2017.03.06 15769
201 php 문자열관련 함수 2017.03.06 15580
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 17 Next
/ 17

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

© k2s0o1d4e0s2i1g5n. All Rights Reserved