[MySQL] 암/복호화

YoungMinKim·2020년 11월 8일
0
post-thumbnail

Section 01


Goal

My-sql 내에서 사용한 복호화 코드에 대해 간략히 정리 해보자.

Ciper_info 테이블 구조

데이터 암호화 복호화를 위한 ciper_info의 테이블 구조는 위와 같다.

My-sql 출력 결과

복호화 코드

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; 
  • Mysql 내에서 password() 함수를 사용해 암호화하면 보안에 취약하다는 소리가 있다.
  • Mysql은 기본적으로 또는 내부적으로 SHA1 알고리즘을 사용하기 때문이다.
  • 그러므로 SELECT SHA(cipher_passphrase, 512)를 사용해 암호화를 수행 한다.

AES 암복호화 정리

아래의 내용은 다른 분의 게시글을 인용 하였습니다.

AES_DECRYPT(crypt_str , key_str [, init_vector ])

위 기능은 공식 AES(Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 암호 해독합니다. 선택적 초기화 벡터 인자init_vectorMySQL 5.6.17부터 사용 가능합니다.

이 버전에서 AES_DECRYPT AES_DECRYPT()를 사용하는 AES_DECRYPT()은 문 기반 복제에 안전하지 않으므로 쿼리 캐시에 저장할 수 없습니다.


AES_ENCRYPT(str , key_str [, init_vector ])
AES_ENCRYPT() 및 AES_DECRYPT() 이전에 " Rijndael " 이라고 알려진 공식 AES 알고리즘을 사용하여 데이터의 암호화 및 해독을 구현 합니다.

정리

  • AES 표준은 다양한 키 길이를 허용합니다. 기본적으로 이 함수는 128 비트 키 길이의 AES를 구현합니다.
  • MySQL 5.6.17부터는 나중에 설명하는 것처럼 196 또는 256 비트의 키 길이를 사용할 수 있습니다.
  • 키 길이는 성능과 보안 사이의 균형입니다.

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 비트 값을 생성하여 이진 값으로 전달하는 것입니다.

  • 예) AES_ENCRYPT ( '텍스트', UNHEX ( 'F3229A0B371ED2D9441B830D21A390C3'))

패스 프레이즈(passphrase)는 패스 프레이즈해싱하여 AES 키를 생성하는 데 사용할 수 있습니다.

  • 예) AES_ENCRYPT ( '텍스트', UNHEX (SHA2 (내 비밀 암호), 512))
  • 예) AES_ENCRYPT (HEX(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;
profile
https://ym1085.github.io

1개의 댓글

comment-user-thumbnail
2022년 12월 1일

저렇게 MySQL로 암호화된 데이터를 자바 코드를 통해 복호화 할 수 있나요?

답글 달기