DB

[MySQL] ENCODE와 DECODE 함수 사용법 🔐

인생아 2025. 7. 28. 10:38
반응형

MySQL에서 제공하는 간단한 대칭 암호화 함수인 ENCODE()와 DECODE()는 비교적 오래된 방식이지만, 간단한 문자열 암호화에 여전히 사용되고 있다. 보안 수준은 높지 않지만 내부 시스템 데이터 보호, 간단한 식별자 마스킹 등 용도에 따라 활용이 가능하다.

1. ENCODE 함수란?

SELECT TO_BASE64(ENCODE('mysqltest', 'mysecretkey'));
-- 결과 예시: QNLfB0lTAA1aBA==
  • ENCODE(str, pass_str)
    • str: 암호화할 문자열
    • pass_str: 대칭키 역할을 하는 키 문자열
  • 암호화된 결과는 바이너리 형식이므로 반드시 TO_BASE64() 등으로 인코딩해야 저장하거나 확인이 가능하다.

2. DECODE 함수란?

SELECT DECODE(FROM_BASE64('QNLfB0lTAA1aBA=='), 'mysecretkey');
-- 결과: mysqltest
  • DECODE(crypt_str, pass_str)
    • crypt_str: 암호화된 바이너리 문자열
    • pass_str: 암호화에 사용한 동일한 키
  • 복호화할 때는 암호화에 사용한 정확히 같은 키 문자열을 입력해야 올바른 결과가 나온다.
반응형

3. ENCODE / DECODE 기본 예제

-- 암호화
SELECT TO_BASE64(ENCODE('123456-7890123', 'secureKey')) AS 암호문;

-- 복호화
SELECT DECODE(FROM_BASE64('암호문'), 'secureKey') AS 원본값;
  • 실제 저장 시에는 암호화된 값을 VARBINARY, BLOB 형식의 컬럼에 저장하거나, BASE64로 인코딩해서 문자열로 저장하면 관리가 편하다.

4. 테이블에 적용하기

암호화 저장

INSERT INTO member_data (user_id, encrypted_name)
VALUES ('kim123', TO_BASE64(ENCODE('김철수', 'simpleKey')));

복호화 조회

SELECT 
  user_id,
  DECODE(FROM_BASE64(encrypted_name), 'simpleKey') AS real_name
FROM member_data;

5. ENCODE/DECODE vs AES_ENCRYPT 비교

항목 ENCODE/DECODE AES_ENCRYPT/AES_DECRYPT
암호화 수준 낮음 (간단한 XOR 방식) 강력한 블록 암호화 (AES 표준)
복호화 가능 O O
키 관리 평문 문자열 바이트 길이 기준 키 관리 필요
권장 용도 내부 마스킹용, 빠른 처리용 민감 정보 보호용
안전성 낮음 높음

✅ ENCODE/DECODE는 실질적인 보안을 위한 암호화보다는 간단한 난독화 수준으로만 사용해야 한다.

6. 실무에서의 활용 팁

  • 관리자용 내부 시스템에서 식별자 마스킹
  • 로그 기록 시 민감 정보 간접 암호화
  • 일정 기간 후 파기될 데이터 암호화 처리

단, 외부에 노출되거나 장기 보관되는 정보는 AES_ENCRYPT 또는 SHA2 기반 방식 사용이 필수다.

7. 문자셋 인코딩 주의사항

  • ENCODE()/DECODE()는 내부적으로 XOR 연산 기반이기 때문에 문자셋에 따라 결과가 깨질 수 있음
  • 대부분의 경우 utf8mb4 설정을 유지하고, BASE64로 저장하는 방식이 가장 안전하다.

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_encode
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_decode

 

반응형