728x90

https://gist.github.com/joashp/a1ae9cb30fa533f4ad94 를 참조하여 AES 암호화, 복호화 알고리즘을 테스트 했다.


PHP에서 문자열을 암호화할 때 보다 더 강력하게 암호화할 수 있는 salt(솔트), hash 256를 사용한 AES 암호화, 복호화 알고리즘이다.

가장 중요한 것은 secret_key 를 관리하는 방법이다.

web 접속 경로상에 없도록 하거나, 다른 서버에 관리하는 것이 좋다.

아래 예제에서는 $salt 를 이용하여 생성한 값을 가지고 임의로 $secret_key 를 만들었다.


윈도우 기반 autoset9 에서는 openssl_encrypt 에러가 발생하여 리눅스 기반에서 테스트를 했다.


사용법 예제

<?php
include_once 'dbController.php';
require_once 'loginClass.php';
$c = new LoginClass();

$salt = sha1(mt_rand());
echo $salt.'<br />';
$secret_key = "f9a90bfa9e8ddd9965fecc0052e6786cf59f3131";
echo $secret_key.'<br />';
$secret_iv = substr($salt, 0, 20);
echo $secret_iv.'<br />';

$str = '안녕하세요? 홍길동입니다.';
$encrypted = $c->AES_encrypt($str);
echo $encrypted.'<br />';
echo 'encrypted message length : '.strlen($encrypted).'<br />';

$decrypted = $c->AES_decrypt($encrypted);
echo $decrypted.'<br />';
?>



Class

<?php
class DBController {
    private $host = 'localhost';
    private $database = 'test';
    private $userid = 'root';
    private $password = 'autoset';
    protected $db; // 변수를 선언한 클래스와 상속받은 클래스에서 참조할 수 있다.

    public function __construct() {
        $this->db = $this->connectDB();
        // construct 메소드는 객체가 생성(인스턴스화)될 때 자동으로 실행되는 특수한 메소드다.
    }

    function __destruct(){
        mysqli_close($this->connectDB());
        //mysqli_close($this->db);
    }

    private function connectDB() {
        $dbconn = mysqli_connect($this->host, $this->userid, $this->password, $this->database);
        mysqli_set_charset($dbconn, "utf8"); // DB설정이 잘못되어 euc-kr 로 되어 있으면 문제가 됨
        if (mysqli_connect_errno()) {
           printf("Connect failed: %s\n", mysqli_connect_error());
           exit();
        } else {
          return $dbconn;
        }
    }
}//end dbClass

?>

<?php
class LoginClass extends DBController {
    // class 자식클래스 extends 부모클래스
    // override : 부모 클래스와 자식 클래스가 같은 메소드를 정의했을 경우 자식 클래스가 우선시된다.
    // AES 암호화
    function AES_encrypt($plain_text){
        global $secret_key, $secret_iv;
        $encrypt_method = "AES-256-CBC";
        $key = hash('sha256', $secret_key);
        $iv = substr(hash('sha256', $secret_iv), 0, 16);
        $output = openssl_encrypt($plain_text, $encrypt_method, $key, true, $iv);
        return base64_encode($output);
    }

    // AES 복호화
    function AES_decrypt($encrypted_string){
        global $secret_key, $secret_iv;
        $encrypt_method = "AES-256-CBC";
        $key = hash('sha256', $secret_key);
        $iv = substr(hash('sha256', $secret_iv), 0, 16);
        $output = openssl_decrypt(base64_decode($encrypted_string), $encrypt_method, $key, true, $iv);
        return $output;
    }

}//end class LoginClass
?>


https://gist.github.com/kijin/8404004 를 참조하여 AES 암호화, 복호화를 해도 좋을 거 같다.


728x90

'Web 프로그램 > 암호화 처리' 카테고리의 다른 글

phpMyAdmin 해킹시도 흔적  (0) 2018.06.11
[PHP] SHA384 패스워드 만들기  (0) 2017.01.27
[보안] PHP AES 암호화 예제  (0) 2016.10.16
[보안] SEED PHP 사용법  (0) 2016.10.15
블로그 이미지

Link2Me

,