암복호화

유영·2023년 3월 6일
0

PHP

목록 보기
52/57

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

  1. SHA-256, SHA-512
    단방향 암호화 알고리즘 입니다.
    // SHA-256

$hashed = base64_encode(hash('sha256', 'password', true));

SHA-512

$hashed = base64_encode(hash('sha512', 'password', true));
echo $hashed;

hash 함수 원형
string hash ( string algo , string $data [, bool $raw_output = false ] ) 인자는 기본적으로 2개가 들어가며 추가적으로 결과 반환에 대한 부분을 설정할 수 있다.algo : 해시 알고리즘 (md5, sha256 ...)
data:해시알고리즘을적용할데이터data : 해시 알고리즘을 적용할 데이터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;
 }

0개의 댓글