DB

[MySQL] AES_ENCRYPT, AES_DECRYPT로 대칭키 암호화 🔐

인생아 2025. 7. 25. 18:50
반응형

MySQL에서 가장 널리 사용되는 양방향 대칭키 암호화 함수는 AES_ENCRYPT()와 AES_DECRYPT()이다. 이 함수는 데이터를 암호화해서 안전하게 저장하고, 필요 시 복호화할 수 있다는 점에서 개인정보, 인증 정보, 금융 데이터 처리 등 민감한 데이터를 다룰 때 유용하다.

단방향 해시 함수와 달리, 암호화된 데이터를 원래 값으로 되돌릴 수 있다는 점이 가장 큰 차이점이다.

1. AES_ENCRYPT 함수란?

SELECT TO_BASE64(AES_ENCRYPT('secret', 'mykey')) AS 암호문;
  • 첫 번째 인자: 암호화할 문자열
  • 두 번째 인자: 대칭키(비밀키)
  • 결과는 바이너리이므로 가공 없이 바로 출력하면 깨짐 → BASE64 인코딩 필요
  • AES-128, AES-256 방식은 키 길이에 따라 자동 적용됨

2. AES_DECRYPT 함수란?

SELECT AES_DECRYPT(FROM_BASE64('암호문'), 'mykey');
  • 암호화된 데이터를 원래 값으로 복호화
  • 암호화에 사용된 키와 동일한 키를 사용해야 정상적으로 복호화된다.
  • BASE64로 인코딩된 암호문은 FROM_BASE64()로 다시 디코딩한 뒤 사용
반응형

3. 기본 암복호화 예제

-- 암호화
SELECT TO_BASE64(AES_ENCRYPT('민감정보', 'key1234')) AS enc;

-- 복호화
SELECT AES_DECRYPT(FROM_BASE64('암호문'), 'key1234') AS 복호화결과;
  • 암호문을 직접 복호화해보면 바이너리 → 문자열 처리 필요
  • AES_DECRYPT() 결과도 바이너리이므로 CAST 또는 CONVERT로 문자형 처리가 필요할 수 있다.
SELECT CONVERT(AES_DECRYPT(FROM_BASE64('암호문'), 'key1234') USING utf8) AS 복호화;

4. 테이블에 적용하기

사용자 정보 저장 예시

INSERT INTO secure_users (username, encrypted_phone)
VALUES (
  'user01',
  TO_BASE64(AES_ENCRYPT('01012345678', 'secureKey!'))
);

복호화 조회

SELECT 
  username,
  CONVERT(AES_DECRYPT(FROM_BASE64(encrypted_phone), 'secureKey!') USING utf8) AS phone
FROM secure_users;
  • 데이터베이스에 저장할 때는 BLOB 또는 VARBINARY 컬럼 타입 사용 권장

5. 실무 팁: 키 관리가 핵심

  • AES_ENCRYPT()와 AES_DECRYPT()는 모두 대칭키 기반이므로 키가 노출되면 데이터도 쉽게 복호화됨
  • 키는 코드에 직접 넣기보다는 환경변수, Vault, Config Server 등을 통해 보안 영역에서 분리 관리하는 것이 필수다
  • 키 교체 시에는 재암호화 작업도 고려해야 함
반응형

6. AES 암호화 시 주의할 점

주의사항 설명
키 길이 16, 24, 32바이트로 맞추는 것이 좋다 (AES-128, AES-192, AES-256)
바이너리 처리 결과는 바이너리로 나오므로 반드시 BASE64 인코딩 후 저장
문자셋 충돌 utf8, euckr 등의 문자셋에 따라 복호화 결과가 깨질 수 있음
키 노출 위험 하드코딩은 금물. 반드시 보안 저장소를 사용

7. 암호화 대상 필드 추천 예시

  • 주민등록번호
  • 휴대폰 번호
  • 이메일 주소
  • 결제 관련 정보
  • API 키, 토큰

8. SHA2와의 차이

구분 AES_ENCRYPT SHA2
암호화 방식 양방향(복호화 가능) 단방향 (복호화 불가)
사용 목적 민감 정보 저장, 복호화 필요 시 비밀번호 저장, 인증 목적
키 필요 여부 필요 필요 없음

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-encrypt
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_aes-decrypt

 

반응형