MySQL(Community Version)에서 기본적으로 제공하는 암호화 알고리즘들이 있다.
대칭키 암호화 알고리즘은 암호화를 할 때 사용하는 key와 복호화에 사용하는 key가 동일하다.
key가 공개될 경우 원문을 해독할 수 있기 때문에 key의 보안은 필수이다.
이러한 점 때문에 대칭키 암호화 알고리즘은 다른 말로 비밀키 암호화 알고리즘이라고도 한다.
MySQL Community 8.0.0 버전에서 대칭키 암호화 알고리즘으로 AES와 DES를 제공한다.
사용방법은 동일하나, DES 알고리즘은 8.0.3 버전부터 제거되기 때문에 AES 알고리즘으로 대체하여 사용하는 것을 권장한다.
AES 알고리즘은 블록 암호(Block Cipher) 알고리즘의 일종이다.
블록 암호란 특정 문장을 암호화 할 때, 고정된 블록 단위로 암호화 하는 것을 의미한다.
특정 문장에서 여러 블록이 있을 때, 블록 내의 문장이 동일할 경우 같은 암호화 결과가 나와 원문을 추론할 수 있다는 보안적 이슈에 의해 iv(초기화 벡터, initialization vector)를 사용하여 동일 문장 추론을 방지할 수 있다.
블록 암호화 모드는 block_encryption_mode
시스템 변수에 설정할 수 있다.
변수의 작성방법은 aes-keylen-mode 로 keylen은 말 그대로 키의 길이이고 mod는 운용 방식이 들어간다.
keylen에는 128, 192, 256 이 들어갈 수 있다.
SELECT @@block_encryption_mode;
# aes-128-ecb
CBC 운용방식과 iv를 이용하여 암호화 및 복호화를 해보자.
대칭키로 이용될 @key는 SHA-2 512bit 를 이용하여 문자열을 암호화 했다.
참고로 iv는 최소 16byte 이상이어야 합니다.
SET block_encryption_mode = 'aes-256-cbc';
SET @key = SHA2('test secret', 512);
SET @iv = RANDOM_BYTES(16);
SET @crypt_str = AES_ENCRYPT('test@email.com', @key, @iv);
SELECT AES_DECRYPT(@crypt_str, @key, @iv);
# test@email.com
RANDOM_BYTES 함수를 이용하여 임의로 16byte 크기의 iv를 생성했다.
ECB 운용방식을 이용하여 암호화 및 복호화를 해보자.
ECB 운용방식은 iv를 이용하지 않는다.
SET block_encryption_mode = 'aes-128-ecb';
SET @key = SHA2('test secret', 512);
SET @crypt_str = AES_ENCRYPT('test@email.com', @key);
SELECT AES_DECRYPT(@crypt_str, @key);
# test@email.com
해쉬함수를 이용하여 Hash(=Digest)를 만드는 알고리즘이다.
해쉬함수 또는 다이제스트 함수라고도 불린다.
해쉬함수를 이용하여 암호화는 가능하지만 복호화는 불가능하다.
128 bit Hash로 변환하는 단방향 암호화 알고리즘.
보안에 취약하여 개인정보 암호화에 사용하는 것은 권장하지 않는다.
주로 프로그램이나 파일이 원본과 같은지 확인하는 데에 쓰인다.
SELECT MD5('test'), LENGTH(MD5('test'));
# MD5('test') LENGTH(MD5('test'))
# 098f6bcd4621d373cade4e832627b4f6 32
MD5는 16진수 숫자로 이뤄진 길이 32의 문자열을 반환한다.
1byte = 8bit = 16진수 두글자
따라서 길이가 32인 문자열은 16byte(=128bit)이다.
SHA1(str)
입력받은 문자열 str을 160 bit의 Digest로 변환하는 해쉬 알고리즘이다.
SELECT SHA1('test'), LENGTH(SHA1('test'));
# SHA1('test') LENGTH(SHA1('test'))
# a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 40
MD5는 16진수 숫자로 이뤄진 길이 40의 문자열을 반환한다.
따라서 길이가 40인 문자열은 20byte(=160bit)이다.
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
과 같이 줄여서 부른다.
SELECT SHA2('test',256), LENGTH(SHA2('test',256));
# SHA2('test',256) LENGTH(SHA2('test',256))
# 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 64
SHA-256 은 16진수 숫자로 이뤄진 길이 64의 문자열을 반환한다.
따라서 길이가 64인 문자열은 32byte(=256bit)이다.