MySQL에서 문자열 암호화 및 복호화하기
MySQL에서 데이터를 안전하게 저장하려면 문자열을 암호화해야 할 때가 많습니다. 이때 MySQL에서 제공하는 AES_ENCRYPT() 함수로 암호화하고, AES_DECRYPT() 함수로 복호화할 수 있습니다. 두 함수는 AES(Advanced Encryption Standard) 알고리즘을 기반으로 동작하며, 비밀 키(Secret Key)를 사용해 데이터를 보호합니다.
기본 문법
암호화하여 데이터를 저장할 때는 다음과 같이 INSERT 문과 함께 사용합니다.
INSERT INTO yourTableName VALUES(AES_ENCRYPT(yourValue, yourSecretKey));
저장된 데이터를 복호화하여 조회할 때는 SELECT 문에서 CAST를 함께 사용해 문자열로 변환합니다.
SELECT CAST(AES_DECRYPT(yourColumnName, yourSecretKey) AS CHAR) FROM yourTableName;
예제 테이블 생성
먼저 암호화된 데이터를 저장할 BLOB 타입의 컬럼을 갖는 테이블을 생성합니다. 암호화된 값은 바이너리 형태이므로 BLOB 타입이 적합합니다.
mysql> CREATE TABLE demo63
-> (
-> value blob
-> );
Query OK, 0 rows affected (2.60 sec)
암호화된 데이터 삽입
INSERT 문에 AES_ENCRYPT() 함수를 사용하면 데이터가 저장되는 시점에 암호화됩니다. 여기서는 비밀 키로 'PASS'를 사용했습니다.
mysql> INSERT INTO demo63 VALUES(AES_ENCRYPT('John','PASS'));
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO demo63 VALUES(AES_ENCRYPT('David','PASS'));
Query OK, 1 row affected (0.41 sec)
mysql> INSERT INTO demo63 VALUES(AES_ENCRYPT('123456','PASS'));
Query OK, 1 row affected (0.41 sec)암호화된 데이터 확인
SELECT 문으로 테이블을 조회하면 원본 문자열이 아닌 암호화된 16진수 형태의 값이 출력됩니다.
mysql> SELECT * FROM demo63;
실행 결과는 다음과 같습니다.
+------------------------------------+
| value |
+------------------------------------+
| 0x16D8A4F11321D761920783BF96BB8314 |
| 0x0A85099F705F21D27B0129C54C4473AA |
| 0xAB7C6D6068BC100B0F04D1C4EA068AC9 |
+------------------------------------+
3 rows in set (0.00 sec)
복호화하여 원본 데이터 조회
AES_DECRYPT() 함수에 저장된 컬럼과 암호화 시 사용한 것과 동일한 비밀 키('PASS')를 전달하면 원본 값을 되돌릴 수 있습니다. CAST(... AS CHAR)를 사용해 결과를 읽기 쉬운 문자열 형태로 변환합니다.
mysql> SELECT CAST(AES_DECRYPT(value, 'PASS') AS CHAR) FROM demo63;
실행 결과는 다음과 같습니다.
+------------------------------------------+
| cast(aes_decrypt(value, 'PASS') AS CHAR) |
+------------------------------------------+
| John |
| David |
| 123456 |
+------------------------------------------+
3 rows in set (0.00 sec)
정리
MySQL에서 문자열을 암호화하려면 AES_ENCRYPT(값, 비밀키)를, 복호화하려면 AES_DECRYPT(컬럼명, 비밀키)를 사용하면 됩니다. 단, 반드시 암호화 시 사용한 것과 동일한 비밀 키를 복호화에 사용해야 올바른 원본 값을 얻을 수 있으며, 암호화된 데이터는 BLOB 타입 컬럼에 저장하는 것이 좋습니다.