무료로 사용이 가능한 MariaDB에서는 단/양방향의 암호화 기능을 제공합니다. 본문에서 사용된 암호화는 단방향으로 사용자 패스워드를 암호화할 때 사용되었습니다.
단방향 암호화
일반적으로 암호화는 평문을 암호문으로 바꿔주는 것을 말합니다. 단방향 암호화는 평문을 암호문으로 바꾸는 것만 가능한 암호화 기법입니다. 단방향 암호화는 해시 함수를 이용합니다. 해시 함수는 임의의 평문 데이터를 고정된 길이의 데이터로 반환해줍니다. 또 동일한 값이 입력되면 동일한 출력값을 보장합니다. (이 부분에 대한 위험성은 이 블로그에서 확인할 수 있었습니다)
해시 함수에는 대표적으로 MD5와 SHA가 있는데 일반적으로 사용되는 SHA2를 이용해 암호화를 진행했습니다. MD5, SHA1은 보안성이 취약하다고 발견되어 잘 사용되지 않습니다.
SHA2(str, hash_len)
SHA2는 MariaDB 5.5부터 도입되었습니다.
str: 임의의 평문
hash_len : 임의의 평문 str을 해시 함수 hash_len으로 암호화합니다.. SHA-224,256,384,512 사용이 가능합니다.
암호화를 적용한 테이블은 다음과 같습니다.
SHA256은 256bit로 64글자이기 때문에 길이는 65 정도로 지정했습니다.
현재 데이터로 들어있는 값을 보면 guest2,3,4는 암호화되어 있지 않습니다.
아래 쿼리문을 통해 암호화를 해보겠습니다.
UPDATE PM_USER
SET PASSWORD = SHA2('12345', 256)
WHERE CMPCD = 'P0001'
AND USERID = 'guest2'
로그인시 암호가 맞는지 체크할 때는 입력된 암호를 암호화하여 비교했습니다.
SELECT COUNT(USERID) AS CNT
FROM PM_USER
WHERE CMPCD = 'P0001'
AND USERID = 'guest1'
AND PASSWORD = SHA2('abc1234', 256)
양방향 암호화
양방향은 AES 대칭키 알고리즘의 암호화 기능을 사용하여 테스트를 했습니다.
단방향과 달리 양방향은 평문을 암호문으로 바꾼 후(이 때 암호화키가 사용됩니다) 다시 암호문을 암호화 키를 이용해 평문으로 바꿀 수 있습니다.
AES_ENCRYPT(str, key_str)
암호화를 위한 기본적인 함수 포맷
str: 임의의 평문
key_str: 임의의 평문 str을 암호화 할 때 사용될 암호화키. 암호화키 사용시에도 SHA2를 이용해 암호화하는 것이 좋습니다.
AES_DECRYPT(str, key_str)
복호화를 위한 기본적인 함수 포맷
str : 암호문
key_str : 암호문을 풀기 위한 암호화키.
이제 암호화를 해보겠습니다. 암호화키는 SHA2를 이용해 암호화했습니다.
AES_ENCRYPT 함수만 사용하게 되면 문자가 깨지기 때문에 문자셋을 위해 HEX함수로 한번 감싸주어야 합니다.
HEX를 하게되면 16진수 값의 문자를 반환합니다. 잠시 HEX에 대해 살펴보고 넘어가겠습니다. 아래는 HEX/UNHEX 사용시 결과를 보여주고 있습니다.
SELECT HEX('Test') T1
, UNHEX(HEX('Test')) T2
, CONVERT(UNHEX(HEX('Test')) USING UTF8) T3
FROM PM_USER
UNHEX는 HEX의 역산을 도와줍니다. 16진수를 숫자로 해석을 하고 그 숫자에 대응하는 문자로 변환합니다. 그 결과, 문자들은 바이너리 스트링으로 리턴됩니다. 그리고 UTF8로 CONVERT 작업을 해주면 기존 텍스트로 변환이 가능합니다.
다시 암호화로 돌아와서 아래 쿼리문으로 암호화/복호화를 해보겠습니다.
UPDATE PM_USER
SET PASSWORD = HEX(AES_ENCRYPT('abc1234', SHA2('shxdb@123', 256)))
WHERE CMPCD = 'P0001'
AND USERID = 'guest4'
SELECT USERID
, PASSWORD
, LENGTH(PASSWORD)
, CONVERT(AES_DECRYPT(UNHEX(PASSWORD), SHA2('shxdb@123',256)) USING UTF8) DECPASS
FROM PM_USER
WHERE CMPCD = 'P0001'