2020. 7. 22. 12:06ㆍDB/MySQL
MySQL 에서는 기본적으로 제공하고 있는 암호화 알고리즘이 몇가지 있습니다.
Enterprise 버전의 경우 더 다양 암호화 알고리즘을 제공하지만, Community버전에서도 유용한 알고리즘이 있어 몇가지 소개를 해보도록 하겠습니다.
대칭키 암호화 알고리즘
대칭키 암호화 알고리즘은 암호화시 이용하는 키와 복호화에 이용하는 키가 동일합니다.
키기 공개될 경우 원문을 해독할 수 있기 때문에 키의 보안은 필수입니다.
이런 점 때문에 대칭키 암호화 알고리즘은 다른 말로 비밀키 암호화 알고리즘이라고도 불립니다.
MySQL Community 8.0 버전에서 대칭키 암호화 알고리즘으로 AES와 DES를 제공합니다.
사용방법은 동일하나, DES 알고리즘은 8.0.3버전부터 제거되기 때문에 AES 알고리즘으로 대체하여 사용하는 것을 권장합니다.
AES
AES 알고리즘은 블록 암호(Block Cipher) 알고리즘의 일종입니다.
블록 암호란 특정 문장을 암호화 할때, 고정된 블록 단위로 암호화 하는 것을 의미합니다.
특정 문장에서 여러 블록이 있을 때, 블록 내의 문장이 동일할 경우 같은 암호화 결과가 나와 원문을 추론할 수 있다는 보안적 이슈에 의해 iv(초기화 벡터, initialization vector)를 사용하여 동일 문장 추론을 방지할 수 있습니다.
- iv를 이용하는 운용방식 : CBC, CFB1, CFB8, CFB128, OFB
- iv를 이용하지 않는 운용방식 : ECB
블록암호화 모드는 block_encryption_mode
시스템 변수에 설정할 수 있습니다.
변수의 작성방법은 aes-keylen-mode 로 keylen은 말 그대로 키의 길이이고 mod는 운용방식이 들어갑니다.
keylen에는 128, 192, 256 이 들어갈 수 있습니다.
mysql> SELECT @@block_encryption_mode; +-------------------------+ | @@block_encryption_mode | +-------------------------+ | aes-128-ecb | +-------------------------+
1) AES/CBC + iv(SHA-512)
CBC 운용방식과 iv를 이용하여 암호화 및 복호화를 해봅시다.
대칭키로 이용될 @key는 SHA-2 512bit 를 이용하여 문자열을 암호화 했습니다.(아래에서 더 상세히 설명합니다.)
참고로 iv는 최소 16byte 이상이어야 합니다.
SET block_encryption_mode = 'aes-256-cbc'; SET @key = SHA2('jini secret passphrase', 512); SET @iv = RANDOM_BYTES(16); SET @crypt_str = AES_ENCRYPT('jini@jiniworld.me', @key, @iv);
SELECT AES_DECRYPT(@crypt_str, @key, @iv); +------------------------------------+ | AES_DECRYPT(@crypt_str, @key, @iv) | +------------------------------------+ | jini@jiniworld.me | +------------------------------------+
RANDOM_BYTES 함수를 이용하여 임의로 16byte 크기의 iv를 생성하였습니다.
2) AES/ECB
ECB 운용방식을 이용하여 암호화 및 복호화를 해봅시다.
ECB 운용방식은 iv를 이용하지 않습니다.
SET block_encryption_mode = 'aes-128-ecb'; SET @key = SHA2('jini secret passphrase', 512); SET @crypt_str = AES_ENCRYPT('jini@jiniworld.me', @key);
SELECT AES_DECRYPT(@crypt_str, @key); +-------------------------------+ | AES_DECRYPT(@crypt_str, @key) | +-------------------------------+ | jini@jiniworld.me | +-------------------------------+
일방향 암호화 알고리즘
해쉬함수를 이용하여 Hash(= Digest)를 만드는 알고리즘입니다.
해쉬함수 또는 다이제스트 함수라고도 불리웁니다.
해쉬함수를 이용하여 암호화는 가능하지만 복호화는 불가능합니다.
MD5
128 bit Hash로 변환하는 일방향 암호화 알고리즘.
보안에 취약하여 개인정보 암호화에 사용하는 것은 권장하지 않습니다.
주로 프로그램이나 파일이 원본과 같은지 확인하는 데에 쓰입니다.
mysql> SELECT MD5('jini'), LENGTH(MD5('jini')); +----------------------------------+---------------------+ | MD5('jini') | LENGTH(MD5('jini')) | +----------------------------------+---------------------+ | ac5179b303372dfcca2096e6909ebc60 | 32 | +----------------------------------+---------------------+
MD5는 16진수 숫자로 이뤄진 길이 32의 문자열을 반환합니다.
1byte = 8bit = 16진수 두글자
따라서 길이가 32인 문자열은 16byte(=128bit)입니다.
SHA-1
SHA1(str)
입력받은 문자열 str을 160 bit의 Digest로 변환하는 해쉬 알고리즘입니다.
mysql> SELECT SHA1('jiniworld'), LENGTH(SHA1('jiniworld')); +------------------------------------------+---------------------------+ | SHA1('jiniworld') | LENGTH(SHA1('jiniworld')) | +------------------------------------------+---------------------------+ | 8208633056a73f1ad2420302b59a37902033ecb0 | 40 | +------------------------------------------+---------------------------+
MD5는 16진수 숫자로 이뤄진 길이 40의 문자열을 반환합니다.
따라서 길이가 40인 문자열은 20byte(=160bit)입니다.
SHA-2
SHA2(str, hash_length)
입력받은 문자열 str을 hash_length
bit로 된 Digest(Hash)로 변환하는 해쉬 알고리즘입니다.
SHA-1의 개선버전입니다.
hash_length에는 224, 256(= 0), 384, 512가 들어올 수 있습니다.
SHA-2 512bit → SHA-512
, SHA-2 256bit → SHA-256
과 같이 줄여서 부릅니다.
mysql> SELECT SHA2('jiniworld',256), LENGTH(SHA2('jiniworld',256)); +------------------------------------------------------------------+-------------------------------+ | SHA2('jiniworld',256) | LENGTH(SHA2('jiniworld',256)) | +------------------------------------------------------------------+-------------------------------+ | 8f08fcca78211615151aecbe7693a47504e66c4b4feffe4a5f9fa7e4424dc67f | 64 | +------------------------------------------------------------------+-------------------------------+
SHA-256 은 16진수 숫자로 이뤄진 길이 64의 문자열을 반환합니다.
따라서 길이가 64인 문자열은 32byte(=256bit)입니다.
++
- Mysql Encryption Function
'DB > MySQL' 카테고리의 다른 글
[MySQL] mysql_config_editor를 이용한 자격정보 저장 (login-path) (0) | 2020.10.26 |
---|---|
[MySQL Function] 숫자 함수 (0) | 2020.07.21 |
[MySQL Function] 날짜, 시간 함수 (0) | 2020.04.28 |
[MySQL] 3. user(계정) 생성, 로그인, 변경, 삭제 (6) | 2020.04.23 |
[MySQL] sql_mode로 알아보는 시스템 변수 permanent, runtime설정 (1) | 2020.03.16 |