[MySQL] 양방향 암호화기법-AES_ENCRYPT n AES_DECRPYT
- Databases/MySQL
- 2020. 10. 19.
■ AES 암호화 기법
MySQL에서 제공하는 암호화 기법은 여러가지가 있습니다.
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html
그중에 키를 이용한 AES 암호화 기법이 있습니다. 이것에 대해 한번 알아보겠습니다.
이 암호화 기법은 AES 암호 알고리즘(Advanced Encryption Standard)이라고 합니다.
다음을 참고하시면 자세한 내용을 확인해 보실 수 있습니다.
■ 암호화 설정
암호화 방식은 서버 변수로 설정을 합니다. 이 설정 방법에 따라 강력한 암호화를 설정할 수 있습니다.
대신 그만큼 성능이 낮아지는것은 참고하셔야 합니다.
서버변수중 block_encryption_mode이란 변수가 있습니다. 이 변수를 이용하서 암호화 형식을 지정합니다. 그리고 이 암호화 변수는 aes-keylen-mode 의 형식을 가집니다. 각각의 형식을 살펴보면
aes : 암호화
keylen : 비트들의 키 길이. 128, 192, 256. 값이 클수록 시스템의 성능에 영향이 있습니다.
mode : 지원되는 암호화 형식입니다. 다음과 같은 것들이 있습니다.
OpenSSL : ECB, CBC, CFB1, CFB8, CFB128, OFB
yaSSL : ECB, CBC
이 변수의 기본값은 aes-128-ecb 입니다. 만약 이 암호화 형식을 바꾸고 싶으면 마지막 값을 바꿉니다. 즉
mysql> SET block_encryption_mode = 'aes-128-cbd';
로 바꾸면 됩니다.
만약 암호화 길이를 바꾸고 싶다면
mysql> SET block_encryption_mode = 'aes-256-cbd';
가운데 숫자를 바꾸면 됩니다.
■ 부가 펑션
RANDOM_BYTES(len)
이 함수는 SSL 라이브러리의 난수 생성기를 사용하여 생성 된 len 난수 바이트의 이진 문자열을 반환합니다. 허용되는 len 값의 범위는 1에서 1024까지입니다. 해당 범위를 벗어난 값의 경우 오류가 발생합니다.
mysql> select RANDOM_BYTES(16);
-> {2zn<
SHA2
SHA-2 해시 함수 제품군 (SHA-224, SHA-256, SHA-384 및 SHA-512)을 계산합니다. 첫 번째 인수는 해시 할 일반 텍스트 문자열입니다. 두 번째 인수는 결과의 원하는 비트 길이를 나타내며 값은 224, 256, 384, 512 또는 0 (256과 동일)이어야합니다. 인수가 NULL이거나 해시 길이가 허용 된 값 중 하나가 아닌 경우 반환 값은 NULL입니다. 그렇지 않으면 함수 결과는 원하는 비트 수를 포함하는 해시 값입니다.
mysql> SELECT SHA2('abc', 224);
-> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
■ 사용방법
서버 변수를 설정했다면 다음과 같이 사용합니다.
▶︎ 암호화 방식
암호화를 하는 펑션은 다음과 같습니다.
AES_DECRYPT(crypt_str,key_str[,init_vector])
crypt_str : 암호화를 할 문자열
key_str : 암호화를 할때 사용하는 키. 이 암호화 키도 SHA2 펑션을 이용해서 암호화 시키기를 권고하고 있습니다.
init_vector : 선택적 인수로 필요로하는 블록 암호화 모드에 대한 초기화 벡터를 제공.
이 선택적 인수는 16 bytes(16글자)로 설정합니다. 이 크기 이상으로 설정시 자동으로 무시됩니다. 또한 이 인수를 사용하지 않아도 되지만 경고가 떨어지게 됩니다. 가능하면 사용하기를 권고 드립니다.
암호화를 푸는 펑션은 다음과 같습니다.
AES_ENCRYPT(str,key_str[,init_vector])
str : 암호화 된 문자열
key_str : 암호화 키. 이 키값을 모르면 복원 불가능.
init_vector : 선택적 인수. 위에서 설명.
암호화를 풀때는 반드시 암호화한 키와 인수를 반드시 일치치켜야 합니다. 그렇지 않을 시 값이 올바르게 나타나지 않습니다.
▶︎ 암호화 예제
mysql> SET block_encryption_mode = 'aes-256-cbc'; -- 암호화 방식을 정합니다. cbc 방식의 256비트 암호화를 사용합니다.
mysql> SET @key_str = SHA2('MySecretPassphrase',512); -- 암호화 문자열을 지정합니다.
mysql> SET @init_vector = RANDOM_BYTES(16); -- 선택적 인수도 특수 문자로 변경합니다.
mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector);
mysql> SELECT AES_DECRYPT(@crypt_str,@key_str,@init_vector);
+-----------------------------------------------+
| AES_DECRYPT(@crypt_str,@key_str,@init_vector) |
+-----------------------------------------------+
| text |
+-----------------------------------------------+
▶︎ 테이블에 입력하는 실 예제
mysql > CREATE TABLE `t1` (
`id` char(10) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> SET block_encryption_mode = 'aes-256-cbc'; -- 변경하지 않고 기본값을 쓰셔도 됩니다. 대신 warning이 떨어집니다.
mysql> SET @key_str = SHA2('MySecretPassphrase', 256);
mysql> SET @init_vector = RANDOM_BYTES(16);
mysql> insert into t1 values('myid',AES_ENCRYPT('text',@key_str,@init_vector));
mysql> SELECT id, AES_DECRYPT(password, @key_str,@init_vector) from t1;
+------+----------------------------------------------+
| id | AES_DECRYPT(password, @key_str,@init_vector) |
+------+----------------------------------------------+
| myid | text |
+------+----------------------------------------------+
1 row in set (0.00 sec)
일반 조회시
mysql> select * from t1;
+------+---------------------------+
| id | password |
+------+---------------------------+
| myid | N™"=Ü1û)ËZÊaoùþ |
+------+---------------------------+
1 row in set (0.01 sec)
▶︎ 암호화 키를 다르게 입력했을시.
SET @key_str = SHA2('MySecretPrase', 256);
+------+----------------------------------------------+
| id | AES_DECRYPT(password, @key_str,@init_vector) |
+------+----------------------------------------------+
| myid | NULL |
+------+----------------------------------------------+
1 row in set (0.00 sec)
'Databases > MySQL' 카테고리의 다른 글
[MySQL] Show Warning, Show Error 명령 (0) | 2020.10.25 |
---|---|
[MySQL] 테이블 정보와 컬럼정보 그리고 테이블 상태 명령 (0) | 2020.10.21 |
[MySQL] SHOW ENGINE과 SHOW ENGINES 명령 (0) | 2020.10.17 |
[MySQL] Prepared 명령 (0) | 2020.10.15 |
[MySQL] KILL 명령 (0) | 2020.10.13 |