My-sql 내에서 사용한 복호화 코드
에 대해 간략히 정리 해보자.
데이터 암호화 복호화를 위한 ciper_info의 테이블 구조는 위와 같다.
select @block_encryption_mode;
SET block_encryption_mode = 'aes-256-cbc';
SET @cipher_passphrase = (SELECT SHA2(cipher_passphrase,512) FROM cipher_info);
SET @cipher_initvector = (SELECT cipher_initvector FROM cipher_info);
SELECT *,
CAST(AES_DECRYPT(UNHEX(secure_phone_num),
@cipher_passphrase, @cipher_initvector) as CHAR)
FROM advance_marketing_phone
WHERE game_code = 131
ORDER BY regist_date DESC;
SELECT SHA(cipher_passphrase, 512)
를 사용해 암호화
를 수행 한다.아래의 내용은 다른 분의 게시글을 인용 하였습니다.
AES_DECRYPT(crypt_str , key_str [, init_vector ]
)
위 기능은 공식 AES(Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 암호 해독
합니다. 선택적 초기화 벡터 인자
인 init_vector
는 MySQL 5.6.17
부터 사용 가능합니다.
이 버전에서 AES_DECRYPT AES_DECRYPT()를 사용하는 AES_DECRYPT()은 문 기반 복제에 안전하지 않으므로 쿼리 캐시에 저장할 수 없습니다.
AES_ENCRYPT(str , key_str [, init_vector ]
)
AES_ENCRYPT() 및 AES_DECRYPT() 이전에 " Rijndael " 이라고 알려진 공식 AES 알고리즘을 사용하여 데이터의 암호화 및 해독을 구현 합니다.
AES_ENCRYPT()
는 키 문자열 key_str
을 사용하여 문자열 str
을 암호화
하고 암호화 된 출력을 포함
하는 2진 문자열
을 반환
합니다.
AES_DECRYPT()
는 키 문자열 key_str
을 사용하여 암호화 된 문자열 crypt_str
을 암호 해독
하고 원래의 일반 텍스트 문자열을 반환
합니다. 함수 인수가 NULL 함수는 NULL 반환.
str 및 crypt_str 인수는 길이가 될 수 있고 padding은 str 에 자동으로 추가되므로 AES와 같은 블록 기반 알고리즘에서 필요한만큼 블록의 배수가됩니다. 이 패딩은 AES_DECRYPT AES_DECRYPT() 함수로 자동 제거됩니다. crypt_str 의 길이는 다음 공식을 사용하여 crypt_str 수 있습니다.
16 * (trunc ( string_length / 16) +1)
128 비트의 키 길이의 경우, key_str 인수에 키를 전달하는 가장 안전한 방법은 진정한 랜덤 128 비트 값을 생성하여 이진 값으로 전달하는 것입니다.
패스 프레이즈
(passphrase)는 패스 프레이즈
를 해싱
하여 AES 키를 생성하는 데 사용할 수 있습니다.
secure_phone_num
), @cipher_passphrase
, @cipher_initvector
);패스프레이즈(Passphrase)란?
암호를 이용한 보안
에서 사용자
는 암기가 쉽고 간단하게 유추
할 수 있으나 공격자
는 유추가 힘들고
공격
에 많은 시간
이 소요
되도록 암호를 생성하는 방법이다.
이를테면, "I want to be a singer when I was kid."
와 같은 긴 문장을 암호화
하여
"Iw2BaS13RwIkD"
와 같은 알아볼 수 없는 무작위 배열
의 암호
를 생성
하는 것이다.
crypt_str에 패스워드 나 패스워드를 직접 건네주지 말고 해쉬하십시오. 이 문서의 이전 버전에서는
이전 방법을 제안했지만 여기에 표시된 예는 더 안전하므로 더 이상 권장되지 않습니다.
AES_DECRYPT() 가 유효하지 않은 데이터 또는 잘못된 패딩을 감지하면 NULL 반환 NULL.
그러나 AES_DECRYPT() 가 입력 데이터 또는 키가 유효하지 않은 경우 NULL 값
(가비지 일 수도 있음 AES_DECRYPT() 을 반환하는 것이 가능합니다.
MySQL 5.6.17부터, AES_ENCRYPT() 와 AES_DECRYPT() 는 블록 암호화 모드의 제어를 허용하고
선택적인 init_vector 초기화 벡터 인수를 취한다
.
◾ block_encryption_mode 시스템 변수
는 블록 기반 암호화 알고리즘의 모드를 제어
합니다.
기본값은 aes-128-ecb ecb이며 키 길이 128 비트 및 ECB 모드를 사용하여 암호화를 나타냅니다.
이 변수의 허용 값에 대한 설명은 5.1.5 절. "서버 시스템 변수"에서 참조하십시오.
MySQL 시스템 변수란?
MySQL 서버
는 기동
하면서 설정 파일의 내용을 읽어
메모리
나 작동 방식
을 초기화
하고, 접속된 사용자를 제어하기 위해 이러한 값을 별도로 저장해 둡니다.
MySQL 서버
에서는 이렇게 저장된 값을 변수
(Variable) 혹은 시스템 변수
라고 합니다.
◾ 선택적 init_vector
인수는 이를 요구하는 블록 암호화 모드에 대한 초기화 벡터를 제공
합니다.
선택적 init_vector 인수가 필요한 모드의 경우 16 바이트 이상
이어야합니다.
(16을 초과하는 바이트는 무시됩니다). init_vector 가 누락되면 오류가 발생합니다.
init_vector 를 필요로하지 않는 모드의 경우, 무시되고 지정되면 경고가 생성됩니다.
RANDOM_BYTES(16) 를 호출하여 초기화 벡터에 사용할 임의의 바이트 문자열을 생성 할 수 있습니다.
초기화 벡터가 필요한 암호화 모드의 경우 암호화 및 암호 해독에 동일한 벡터를 사용해야합니다.
mysql> SET block_encryption_mode = 'aes-256-cbc';
mysql> SET @key_str = SHA2('My secret passphrase',512);
mysql> SET @init_vector = RANDOM_BYTES(16);
mysql> SET @crypt_str = AES_ENCRYPT('text', @key_str, @init_vector);
mysql> SELECT AES_DECRYPT(@crypt_str, @key_str, @init_vector);
+ ------------------------------------------- +
| AES_DECRYPT (@ crypt_str, @ key_str, @ init_vector) |
+ ------------------------------------------- +
| 텍스트 |
+ ------------------------------------------- +
Ex)
create table a_enc (
txt CHAR(200)
)
INSERT INTO a_enc (txt) VALUES (HEX(AES_ENCRYPT('37.566826005485716','secret')))
SELECT AES_DECRYPT(UNHEX(txt),'secret') FROM a_enc;
저렇게 MySQL로 암호화된 데이터를 자바 코드를 통해 복호화 할 수 있나요?