티스토리 뷰
요즘은 개인정보보안이 매우 중요하기 때문에 항상 어떻게 암호화할까를 고민해야 합니다.
현재 구축하는 Application이 Web Site이고 한 곳에서만 사용한다면 별 문제없습니다.
그러나 여러 시스템에서 다양한 프로그램 언어를 사용한다면 DB에서 암복호화를 고민해야 합니다.
관련 솔루션을 구매해서 사용할 수도 있고 함수를 만들어서 complie해서 사용하는 방법도 있습니다.
쉽게 이용하는 방법은 자체 제공하는 함수를 적절하게 사용하는 것입니다.
현재 AWS를 이용해서 서비스 만들고 있고 DB는 오로라 DB를 이용합니다.
해당 버전을 확인하고 암복화관련 함수를 이용해서 SQL를 생성합니다. 됩니다.
[환경]
- AWS Aurora DB
설치되어 있는 mysql 버전 확인
select version();
Table 12.17 Encryption Functions
NameDescription
AES_DECRYPT() | Decrypt using AES |
AES_ENCRYPT() | Encrypt using AES |
ASYMMETRIC_DECRYPT() | Decrypt ciphertext using private or public key |
ASYMMETRIC_DERIVE() | Derive symmetric key from asymmetric keys |
ASYMMETRIC_ENCRYPT() | Encrypt cleartext using private or public key |
ASYMMETRIC_SIGN() | Generate signature from digest |
ASYMMETRIC_VERIFY() | Verify that signature matches digest |
COMPRESS() | Return result as a binary string |
CREATE_ASYMMETRIC_PRIV_KEY() | Create private key |
CREATE_ASYMMETRIC_PUB_KEY() | Create public key |
CREATE_DH_PARAMETERS() | Generate shared DH secret |
CREATE_DIGEST() | Generate digest from string |
DECODE() (deprecated) | Decode a string encrypted using ENCODE() |
DES_DECRYPT() (deprecated) | Decrypt a string |
DES_ENCRYPT() (deprecated) | Encrypt a string |
ENCODE() (deprecated) | Encode a string |
ENCRYPT() (deprecated) | Encrypt a string |
MD5() | Calculate MD5 checksum |
PASSWORD() (deprecated) | Calculate and return a password string |
RANDOM_BYTES() | Return a random byte vector |
SHA1(), SHA() | Calculate an SHA-1 160-bit checksum |
SHA2() | Calculate an SHA-2 checksum |
UNCOMPRESS() | Uncompress a string compressed |
UNCOMPRESSED_LENGTH() | Return the length of a string before compression |
VALIDATE_PASSWORD_STRENGTH() | Determine strength of password |
출처 : https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html
데이터 암호화하는 방법은 단방향 암호화와 쌍방향 암호화 두가지가 있습니다.
1. 단방향 암호화
- 복호화 할 수 없는 암호화, 비밀번호, 주민등록번호 등에서 사용
- MD5, PASSWORD, SHA1, SHA
2. 쌍방향 암호화
- 복호화 가능
- AES_ENCRYPT, AES_DECRYPT
- DES_ENCRYPT, DES_DECRYPT
- ENCODE, DECODE
간단 암복화 예제
SELECT HEX(AES_ENCRYPT('010-123-1234','myPass'));
-- 암호화
-- AES_ENCRYPT 함수사용, 암호화 대상은 '010-123-1234'이고 암호화 키는 'myPass'입니다.
-- 암호화한 값(바이너리)를 HEX로 변환 시킵니다.
-- 결과 'BDFDBC8EFCA5E71397D935E6D1CF22B5'
SELECT AES_DECRYPT(UNHEX('BDFDBC8EFCA5E71397D935E6D1CF22B5'),'myPass');
-- 복호화
-- HEX 값을 다시 바이너리로 바꾸고 복호화합니다.
-- AES_DECRYPT 함수사용, 암호화 키 'myPass'를 이용해서 복호화
-- 결과 '010-123-1234'
암호화 키 값을 매번 넣어 줄 수도 없고 관리도 해야 하니 함수를 하나 만듭니다.
-- 함수생성
-- 암호화
DROP FUNCTION IF EXISTS FN_ENC;
DELIMITER $$
CREATE FUNCTION FN_ENC(fld VARCHAR(200))
RETURNS BLOB
BEGIN
RETURN HEX(AES_ENCRYPT(fld, 'myPass'));
END;
$$
DELIMITER ;
-- 복화화
DROP FUNCTION IF EXISTS FN_DEC;
DELIMITER $$
CREATE FUNCTION FN_DEC(fld VARCHAR(200))
RETURNS VARCHAR(200)
BEGIN
RETURN CONVERT(AES_DECRYPT(UNHEX(fld), 'myPass') using utf8);
END;
$$
DELIMITER ;
사용
SELECT FN_ENC("1234567890");
-- 023D721C13132A3A64822BAE98A7CFF9
SELECT FN_DEC("023D721C13132A3A64822BAE98A7CFF9");
-- 1234567890
이렇게 하면 간단하게 암복화를 할 수 있습니다.
이상 끝~~~
'DB' 카테고리의 다른 글
MYSQL - WITH 구문 (0) | 2023.07.19 |
---|---|
[ORACLE]LISTAGG 함수, ONE TO MANY, SINGLE ROW로 보여주기 (0) | 2020.04.03 |
[Oracle]삭제 데이터 복구하기 (0) | 2020.04.02 |
[MyBatis]mapper에서 공통 property 사용 (0) | 2020.04.02 |
- Total
- Today
- Yesterday
- SHEETJS
- ag grid
- 타임리프
- cache
- 엑셀
- listToMap
- Javascript
- example
- AG-GRID
- sample
- 스프링
- oracle
- thymeleaf
- 예제
- 그리드
- Spring Boot
- 스프링부트
- 설정
- 샘플
- UI
- lombok
- mapToList
- restful서비스
- springboot
- spring
- 메시지
- RESTful
- java
- REST
- mybatis
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |