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 암호화, 복호화를 해도 좋을 거 같다.