MariaDB의 AES_ENCRYPT 함수 분석

들어가며

필자가 웹 사이트를 제작하면서 개인정보와 같이 공개적으로 보여주지 않아야 하는 정보가 있을 것이다. 이는 데이터베이스에서도 마찬가지일 것이다. 이러한 정보는 주로 암호화를 통해 저장된다. DBMS의 종류마다 차이가 있겠지만, 여기에서는 필자가 자주 사용하는 MariaDB에서 AES_ENCRYPT 함수의 작동 방식을 분석해본다.

AES 암호화

AES(Advanced Encryption Standard)는 과거에 사용하던 DES를 대체하며, 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭 키 암호화 알고리즘이다. 키의 길이에 따라 128bit, 192bit, 256bit 등으로 나누어진다.

Rijndael에 기반한 이 알고리즘은 안전성과 효율성, 구현 등을 종합적으로 고려하여 미국 NIST의 AES 공모전에 선정되었다. 물론 탈락한 알고리즘도 부족한 알고리즘은 아니었으나, Rijndael의 알고리즘이 다른 알고리즘에 비해 평가 기준에 적합하다고 판단되었다고 한다.

MariaDB의 암호화

MariaDB에서는 AES-128-ECB 방식을 사용한다. ECB(Electronic Code Book) 모드는 가장 단순한 모드로 블록 단위로 순차적으로 암호화 하는 구조이다. 하지만 단순한 만큼 한 개의 블록만 해독되면 나머지 블록도 해독되는 단점이 있다.

AES 키의 최대 길이는 256bit이나, 실제로 256bit를 초과하는 키를 입력해도 문제 없이 작동이 된다. 키의 길이가 128bit보다 짧으면 부족한 부분을 비트 0으로 채운다(Zero-Padding). 반대로 키의 길이가 128bit보다 길면 키를 128bit 단위로 나누고 XOR 연산을 취한다. 256bit 이상의 키를 입력해도 실제로는 128bit로 작동하는 것이다.

마치며

AES는 널리 사용되는 암호화 알고리즘이고, 다양한 블록 운용 방식이 있다. 필자의 경우 웹(PHP)과 DB의 통신에 사용하는 암호화 알고리즘으로 AES-128-CBC 방식을 사용하고 있다. 물론, DB의 SQL 쿼리에서는 위에서 언급한 AES_ENCRYPT 함수를 사용한다. CBC(Cipher Block Chaining) 방식은 IV(Initialization Vector)를 추가로 요구한다. 즉, 키의 값과 IV의 값에 따라 암호문이 달라질 수 있다.

MariaDB 버전 11.2 이상에서는 기본 모드인 AES-128-ECB뿐 아니라 192bit, 256bit 키의 ECB, CBC, CTR 모드를 지원한다고 한다. 단, MariaDB 버전 11.2는 LTS(Long Term Support)가 아니므로, 사용 시 유의해야 한다. 필자도 AWS RDS에 사용하는 버전을 10.6 LTS에서 10.11 LTS로 업그레이드 했으나, 사용자들이 LTS 버전을 선호하므로 다양한 암호화 모드를 지원하는 최신 버전의 사용은 조금 고민할 필요가 있을 것 같다.

참고 문서

댓글 남기기