웹앱 등에서 활용할만 한 팁을 정리해 봅니다.
자바스크립트에서 CryptoJS 라이브러리를 이용해 데이터를 암호화를 하고 PHP에서 복호화 하는 예제입니다.
(This is the way how to encrypt data with Javascript and decrypt it with PHP)
- 자바스크립트에서 암호화 하는 방법 (Encrypt data with Javascript)
var key = CryptoJS.enc.Hex.parse("1234567811111111abcdefabcd123123"); var iv = CryptoJS.enc.Hex.parse("abcd1231231234567811111111abcdef"); function Encrypt(value) { var encrypted = CryptoJS.AES.encrypt(value, key, {iv:iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}); encrypted = encrypted.ciphertext.toString(CryptoJS.enc.Base64); return encodeURIComponent(encrypted); }
- PHP에서 복호화 하는 방법 (Decrypt data with Javascript)
우선 아래와 같이 클래스를 만듭니다. (First, make a class for decryption)
class AESCrypt { var $skey; var $iv; function setKey($KEY, $IV) { $this->skey = $KEY; $this->iv = $IV; } function decrypt ($value) { $value = base64_decode($value); $output = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->skey, $value, MCRYPT_MODE_CBC, $this->iv) ; $valueLen = strlen($output) ; if ( $valueLen % 16 > 0 ) $output = ""; $padSize = ord ($output{$valueLen - 1}) ; if ( ($padSize < 1) or ($padSize > 16) ) $output = ""; // Check padding. for ($i = 0; $i < $padSize; $i++) { if ( ord ($output{$valueLen - $i - 1}) != $padSize ) $output = ""; } $output = substr ($output, 0, $valueLen - $padSize); return $this->filter($output); } function filter($par) { $par = htmlspecialchars($par); $par = strip_tags($par); $par = mysql_real_escape_string($par); $par = str_replace("'","\"",$par); $par = str_replace("`","\"",$par); $par = $par.trim(); return $par; } }
그리고 아래와 같이 사용합니다. (Decrypt data with PHP)
$mcrypt = new AESCrypt(); $key = attemptpack("1234567811111111abcdefabcd123123"); $iv = attemptpack("abcd1231231234567811111111abcdef"); $mcrypt->setKey($key,$iv); // Decryption $mydata = $mcrypt->decrypt($_GET['data']); function attemptpack($s) { $p=pack("H*", $s); return $p; }