티스토리 뷰

DB

[mysql]암복화 예제

까오기 까오기 2020. 4. 2. 13:54

요즘은 개인정보보안이 매우 중요하기 때문에 항상 어떻게 암호화할까를 고민해야 합니다. 

현재 구축하는 Application이 Web Site이고 한 곳에서만 사용한다면 별 문제없습니다. 

그러나 여러 시스템에서 다양한 프로그램 언어를 사용한다면 DB에서 암복호화를 고민해야 합니다. 

관련 솔루션을 구매해서 사용할 수도 있고 함수를 만들어서 complie해서 사용하는 방법도 있습니다. 

쉽게 이용하는 방법은 자체 제공하는 함수를 적절하게 사용하는 것입니다. 

 

현재 AWS를 이용해서 서비스 만들고 있고 DB는 오로라 DB를 이용합니다. 

해당 버전을 확인하고 암복화관련 함수를 이용해서 SQL를 생성합니다. 됩니다.  

 

[환경]

- AWS Aurora DB

 

설치되어 있는 mysql 버전 확인 

select version();

 

Table 12.17 Encryption Functions

NameDescription

AES_DECRYPT() Decrypt using AES
AES_ENCRYPT() Encrypt using AES
ASYMMETRIC_DECRYPT() Decrypt ciphertext using private or public key
ASYMMETRIC_DERIVE() Derive symmetric key from asymmetric keys
ASYMMETRIC_ENCRYPT() Encrypt cleartext using private or public key
ASYMMETRIC_SIGN() Generate signature from digest
ASYMMETRIC_VERIFY() Verify that signature matches digest
COMPRESS() Return result as a binary string
CREATE_ASYMMETRIC_PRIV_KEY() Create private key
CREATE_ASYMMETRIC_PUB_KEY() Create public key
CREATE_DH_PARAMETERS() Generate shared DH secret
CREATE_DIGEST() Generate digest from string
DECODE() (deprecated) Decode a string encrypted using ENCODE()
DES_DECRYPT() (deprecated) Decrypt a string
DES_ENCRYPT() (deprecated) Encrypt a string
ENCODE() (deprecated) Encode a string
ENCRYPT() (deprecated) Encrypt a string
MD5() Calculate MD5 checksum
PASSWORD() (deprecated) Calculate and return a password string
RANDOM_BYTES() Return a random byte vector
SHA1(), SHA() Calculate an SHA-1 160-bit checksum
SHA2() Calculate an SHA-2 checksum
UNCOMPRESS() Uncompress a string compressed
UNCOMPRESSED_LENGTH() Return the length of a string before compression
VALIDATE_PASSWORD_STRENGTH() Determine strength of password

출처 : https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html

 

MySQL :: MySQL 5.7 Reference Manual :: 12.13 Encryption and Compression Functions

12.13 Encryption and Compression Functions Many encryption and compression functions return strings for which the result might contain arbitrary byte values. If you want to store these results, use a column with a VARBINARY or BLOB binary string data type.

dev.mysql.com

데이터 암호화하는 방법은 단방향 암호화와 쌍방향 암호화 두가지가 있습니다. 

1. 단방향 암호화

- 복호화 할 수 없는 암호화, 비밀번호, 주민등록번호 등에서 사용

- MD5, PASSWORD, SHA1, SHA

2. 쌍방향 암호화

- 복호화 가능 

- AES_ENCRYPT, AES_DECRYPT

- DES_ENCRYPT, DES_DECRYPT

- ENCODE, DECODE

 

간단 암복화 예제 

SELECT HEX(AES_ENCRYPT('010-123-1234','myPass')); 
-- 암호화
-- AES_ENCRYPT 함수사용, 암호화 대상은 '010-123-1234'이고 암호화 키는 'myPass'입니다.
-- 암호화한 값(바이너리)를 HEX로 변환 시킵니다. 
-- 결과 'BDFDBC8EFCA5E71397D935E6D1CF22B5'

SELECT AES_DECRYPT(UNHEX('BDFDBC8EFCA5E71397D935E6D1CF22B5'),'myPass'); 
-- 복호화  
-- HEX 값을 다시 바이너리로 바꾸고 복호화합니다. 
-- AES_DECRYPT 함수사용, 암호화 키 'myPass'를 이용해서 복호화
-- 결과 '010-123-1234'

 

암호화 키 값을 매번 넣어 줄 수도 없고 관리도 해야 하니 함수를 하나 만듭니다. 

-- 함수생성

-- 암호화
DROP FUNCTION IF EXISTS FN_ENC;
DELIMITER $$
CREATE FUNCTION FN_ENC(fld VARCHAR(200)) 
  RETURNS BLOB
BEGIN
  RETURN HEX(AES_ENCRYPT(fld, 'myPass'));
END;
$$
DELIMITER ;

-- 복화화
DROP FUNCTION IF EXISTS FN_DEC;
DELIMITER $$
CREATE FUNCTION FN_DEC(fld VARCHAR(200)) 
  RETURNS VARCHAR(200)
BEGIN
  RETURN CONVERT(AES_DECRYPT(UNHEX(fld), 'myPass') using utf8);
END;
$$
DELIMITER ;

 

사용

SELECT FN_ENC("1234567890");
-- 023D721C13132A3A64822BAE98A7CFF9

SELECT FN_DEC("023D721C13132A3A64822BAE98A7CFF9");
-- 1234567890

 

이렇게 하면 간단하게 암복화를 할 수 있습니다. 

 

이상 끝~~~ 

댓글
댓글쓰기 폼