MYSQL - AES_ENCRYPT, AES_DECRYPT 함수
이 암호화는 128비트 길이로 인코딩되어 저장됩니다.
그러나 소스를 수정해서 256비트까지 확장시킬수 있다고 합니다.
AES_ENCRYPT 는 문자열을 암호화하고, 바이너리 문자열을 반환하지만,
AES_DECRYPT 는 암호화된 문자열을 복호화합니다.
AES_DECRYPT 는 유효하지 않은 데이터는 padding을 감지하고, NULL을 반환합니다.
복호화 또는 디코딩(decoding)은
부호화(encoding)된 데이터를 부호(code)화 되기 전 형태로 바꾸어,
사람이 읽을 수 있는 형태로 되돌려놓는 것이다.
암호화(encryption)의 반대말로서의 복호화는 decryption이라고 부른다.
//키"는 임의의 값이 올 수 있으며,
//"문자열"은 암호화하고자 하는 값이 됩니다.
# AES_ENCRYPT 암호화
INSERT INTO 테이블명 VALUES (HEX(AES_ENCRYPT('문자열', '암호화 키')));
# AES_DECRYPT 복호화
SELECT AES_DECRYPT(UNHEX(필드명), '암호화 키') FROM 테이블명;
예제)
# AES_ENCRYPT 암호화
INSERT INTO tbname VALUE (HEX(AES_ENCRYPT('123456','가나다라')));
// 결과: 5A33E11DC0B638E4E5E74EBD52F55E3D
# AES_DECRYPT 복호화
SELECT AES_DECRYPT(UNHEX(필드명), '가나다라') FROM tbname;
키가 맞지 않으면 데이터가 null 로 출력됩니다!
SHA-256 / SHA-512 / AES-256 / RSA
$hashed = base64_encode(hash('sha256', 'password', true));
$hashed = base64_encode(hash('sha512', 'password', true));
echo $hashed;
hash 함수 원형
string hash ( string algo , string $data [, bool $raw_output = false ] ) 인자는 기본적으로 2개가 들어가며 추가적으로 결과 반환에 대한 부분을 설정할 수 있다.algo : 해시 알고리즘 (md5, sha256 ...)
raw_output : TRUE일 경우 바이너리 데이터로 결과 반환, FALSE일 경우 소문자 hex 값으로 반환
hash 함수 예제
<?php
echo hash('sha256', 'test');
?>
결과 : 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
aes_encrypt()
hash()
gzcompress()
defined()
mcrypt_create_iv()
mcrypt_encrypt()
hash_hmac()
base64_encode()
// AES-256과 HMAC을 사용하여 문자열을 암호화하고 위변조를 방지하는 법.
// 비밀번호는 서버만 알고 있어야 한다. 절대 클라이언트에게 전송해서는 안된다.
// PHP 5.2 이상, mcrypt 모듈이 필요하다.
// 문자열을 암호화한다.
function aes_encrypt($plaintext, $password)
{
// 보안을 최대화하기 위해 비밀번호를 해싱한다.
$password = hash('sha256', $password, true);
// 용량 절감과 보안 향상을 위해 평문을 압축한다.
$plaintext = gzcompress($plaintext);
// 초기화 벡터를 생성한다.
$iv_source = defined('MCRYPT_DEV_URANDOM') ? MCRYPT_DEV_URANDOM : MCRYPT_RAND;
$iv = mcrypt_create_iv(32, $iv_source);
// 암호화한다.
$ciphertext = mcrypt_encrypt('rijndael-256', $password, $plaintext, 'cbc', $iv);
// 위변조 방지를 위한 HMAC 코드를 생성한다. (encrypt-then-MAC)
$hmac = hash_hmac('sha256', $ciphertext, $password, true);
// 암호문, 초기화 벡터, HMAC 코드를 합하여 반환한다.
return base64_encode($ciphertext . $iv . $hmac);
}
// 위의 함수로 암호화한 문자열을 복호화한다.
// 복호화 과정에서 오류가 발생하거나 위변조가 의심되는 경우 false를 반환한다.
function aes_decrypt($ciphertext, $password)
{
// 초기화 벡터와 HMAC 코드를 암호문에서 분리하고 각각의 길이를 체크한다.
$ciphertext = @base64_decode($ciphertext, true);
if ($ciphertext === false) return false;
$len = strlen($ciphertext);
if ($len < 64) return false;
$iv = substr($ciphertext, $len - 64, 32);
$hmac = substr($ciphertext, $len - 32, 32);
$ciphertext = substr($ciphertext, 0, $len - 64);
// 암호화 함수와 같이 비밀번호를 해싱한다.
$password = hash('sha256', $password, true);
// HMAC 코드를 사용하여 위변조 여부를 체크한다.
$hmac_check = hash_hmac('sha256', $ciphertext, $password, true);
if ($hmac !== $hmac_check) return false;
// 복호화한다.
$plaintext = @mcrypt_decrypt('rijndael-256', $password, $ciphertext, 'cbc', $iv);
if ($plaintext === false) return false;
// 압축을 해제하여 평문을 얻는다.
$plaintext = @gzuncompress($plaintext);
if ($plaintext === false) return false;
// 이상이 없는 경우 평문을 반환한다.
return $plaintext;
}