[MySQL] 양방향 암호화기법-AES_ENCRYPT n AES_DECRPYT

■ AES 암호화 기법

MySQL에서 제공하는 암호화 기법은 여러가지가 있습니다.

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

 

그중에 키를 이용한 AES 암호화 기법이 있습니다. 이것에 대해 한번 알아보겠습니다.

 

암호화 기법은 AES 암호 알고리즘(Advanced Encryption Standard)이라고 합니다.

다음을 참고하시면 자세한 내용을 확인해 보실 있습니다.

https://namu.wiki/w/AES

 

 

암호화 설정

암호화 방식은 서버 변수로 설정을 합니다. 설정 방법에 따라 강력한 암호화를 설정할 있습니다.

대신 그만큼 성능이 낮아지는것은 참고하셔야 합니다.

 

서버변수중 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)

Designed by JB FACTORY