본문 바로가기
Database/MYSQL

Mysql AES_DECRYPT / AES_ENCRYPT

by 반화넬 2017. 2. 20.
반응형

• AES_DECRYPT( crypt_str , key_str [, init_vector ])

 이 기능은 공식 AES (Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 암호 해독합니다.  자세한 내용은 AES_ENCRYPT() 설명을 참조하십시오.

 선택적 초기화 벡터 인자 인 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 (Advanced Encryption Standard) 알고리즘을 사용하여 데이터의 암호화 및 해독을 구현 합니다. 
 " AES 표준은 다양한 키 길이를 허용합니다.  기본적으로이 함수는 128 비트 키 길이의 AES를 구현합니다.  MySQL 5.6.17부터는 나중에 설명하는 것처럼 196 또는 256 비트의 키 길이를 사용할 수 있습니다.  키 길이는 성능과 보안 사이의 균형입니다.

 AES_ENCRYPT() 는 키 문자열 key_str 을 사용하여 문자열 str 을 암호화하고 암호화 된 출력을 포함하는 2 진 문자열을 반환합니다.  AES_DECRYPT() 는 키 문자열 key_str 을 사용하여 암호화 된 문자열 crypt_str 을 암호 해독하고 원래의 일반 텍스트 문자열을 반환합니다.  함수 인수가 NULL 함수는 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 비트 값을 생성하여 이진 값으로 전달하는 것입니다.  예 :



 INSERT INTO t
 VALUES (1, AES_ENCRYPT ( '텍스트', UNHEX ( 'F3229A0B371ED2D9441B830D21A390C3'))));


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



 INSERT INTO t
 VALUES (1, AES_ENCRYPT ( '텍스트', UNHEX (SHA2 (내 비밀 암호), 512))));


 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 절. "서버 시스템 변수"에서 참조하십시오.


◾  선택적 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;


반응형