[1] Database 암호화 및 압축 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> select hex(aes_encrypt('namki', 'key')); +----------------------------------+ | hex(aes_encrypt('namki', 'key')) | +----------------------------------+ | F3585A4714643395A5C0CB31AD48E2D6 | +----------------------------------+ 1 row in set (0.00 sec) mysql> select aes_decrypt(unhex('F3585A4714643395A5C0CB31AD48E2D6'), 'key'); +---------------------------------------------------------------+ | aes_decrypt(unhex('F3585A4714643395A5C0CB31AD48E2D6'), 'key') | +---------------------------------------------------------------+ | namki | +---------------------------------------------------------------+ 1 row in set (0.00 sec) | cs |
첫 번째는 aes_encrypt 함수를 사용하여 "str", "key"를 같이 암호화 한 결과이며,
두 번째는 "str", "key"를 unhex하여 원본 데이터를 출력한 화면이다.
1 2 3 4 5 6 7 | mysql> select hex(aes_encrypt(SHA2('namki',256), 'key')); +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | hex(aes_encrypt(SHA2('namki',256), 'key')) | +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 3534984F87252E1971C1D2AF770ABDC61814217A594B90E24C497BF0B3C32C152962F7CEC4E7BF8C3CFC87A622DE4322F942E9BA1C5E49516D4CD51DC512687DC717530F41F320757B4AA1BFAF11C42E | +------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) | cs |
1 2 3 4 5 6 7 | mysql> select aes_decrypt(unhex('{ hash data }'), 'key'); +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | aes_decrypt(unhex(SHA2('{ hash data }', 256)), 'key') | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | a54e780955d4fe430f6a89a0608f5240d6b828dd8765744893d6e3b2264a4177 | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) | cs |
이번에는 sha2 함수를 이용해 256비트까지 출력해보았다. 또한, aes_decrypt에서는 only-hash data만 type str으로 넣어주면 해석된다.
표 암호화 기능
이름 | 기술 |
---|---|
AES_DECRYPT() | AES를 사용하여 해독 |
AES_ENCRYPT() | AES를 사용하여 암호화 |
ASYMMETRIC_DECRYPT() | 개인 또는 공개 키를 사용하여 암호문을 해독합니다. |
ASYMMETRIC_DERIVE() | 비대칭 키로부터 대칭 키 유도 |
ASYMMETRIC_ENCRYPT() | 개인 또는 공개 키를 사용하여 일반 텍스트 암호화 |
ASYMMETRIC_SIGN() | 다이제스트에서 서명 생성 |
ASYMMETRIC_VERIFY() | 서명이 다이제스트와 일치하는지 확인하십시오. |
COMPRESS() | 결과를 바이너리 문자열로 반환 |
CREATE_ASYMMETRIC_PRIV_KEY() | 개인 키 만들기 |
CREATE_ASYMMETRIC_PUB_KEY() | 공개 키 만들기 |
CREATE_DH_PARAMETERS() | 공유 DH 비밀 생성 |
CREATE_DIGEST() | 문자열에서 다이제스트 생성 |
DECODE() | ENCODE ()를 사용하여 암호화 된 문자열을 디코딩합니다. |
DES_DECRYPT() | 문자열 해독 |
DES_ENCRYPT() | 문자열 암호화 |
ENCODE() | 문자열 인코딩 |
ENCRYPT() | 문자열 암호화 |
MD5() | MD5 체크섬 계산 |
PASSWORD() | 암호 문자열 계산 및 반환 |
RANDOM_BYTES() | 임의의 바이트 벡터를 반환합니다. |
SHA1() , SHA() | SHA-1 160 비트 체크섬 계산 |
SHA2() | SHA-2 체크섬 계산 |
STATEMENT_DIGEST() | 명령문 다이제스트 해시 값 계산 |
STATEMENT_DIGEST_TEXT() | 정규화 된 명령문 다이제스트 계산 |
UNCOMPRESS() | 압축 된 문자열 압축 해제 |
UNCOMPRESSED_LENGTH() | 압축 전의 캐릭터 라인의 길이를 돌려줍니다. |
VALIDATE_PASSWORD_STRENGTH() | 암호의 강도 결정 |
많은 암호화 및 압축 함수는 결과에 임의의 바이트 값이 포함될 수있는 문자열을 반환합니다. 이러한 결과를 저장하려면 VARBINARY
또는 BLOB
2 진. 자열 데이터 유형 의 컬럼을 사용하십시오 . 이렇게하면 이진이 아닌 문자열 데이터 형식 (사용하는 경우 발생할 수 등의 데이터 값을 변경 할 후행 공백 제거 또는 문자 집합 변환, 잠재적 인 문제를 피할 것 CHAR
, VARCHAR
, TEXT
)를.
: 일부 암호화 기능은 ASCII 문자의 문자열을 반환 MD5()
, SHA()
, SHA1()
, SHA2()
, STATEMENT_DIGEST()
,를 STATEMENT_DIGEST_TEXT()
. 반환 값은 character_set_connection
및 collation_connection
시스템 변수에 의해 결정되는 문자 집합과 데이터 정렬을 갖는 문자열입니다 . 문자 집합이 아닌 한 이진이 아닌 문자열입니다 binary
.
응용 프로그램에서와 같은 함수의 값을 저장 MD5()
하거나 SHA1()
16 진수 문자열을 반환하는 경우 16 진 표현을 사용하여 2 진수로 변환 UNHEX()
하고 결과를 열에 저장하면 보다 효율적인 저장 및 비교를 얻을 수 있습니다 . 각 쌍의 16 진수에는 2 진수 형식의 1 바이트가 필요하므로 값은 16 진수 문자열의 길이에 따라 다릅니다. 값의 경우 16이고 값의 경우 20입니다 . 를 들어 , 그 결과 원하는 비트 길이를 지정하는 인수에 따라 28부터 32까지의 범위이다. BINARY(
N
)N
N
MD5()
SHA1()
SHA2()
N
CHAR
열에 16 진수 문자열을 저장하는 데 대한 크기 패널티 는 utf8
문자 집합 을 사용하는 열에 값이 저장되는 경우 (각 문자가 4 바이트 를 사용하는 경우) 적어도 두 번 입니다. 문자열을 저장하면 큰 값과 문자 집합 조합 규칙을 고려해야하므로 비교가 더 느려집니다.
응용 프로그램이 MD5()
문자열 값을 CHAR(32)
열에 저장한다고 가정합니다 .
CREATE TABLE md5_tbl (md5_val CHAR(32), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(MD5('abcdef'), ...);
더 컴팩트 한 형태로 진수 문자열로 변환 사용하도록 응용 프로그램을 수정 UNHEX()
하고 BINARY(16)
다음과 같이 대신 :
CREATE TABLE md5_tbl (md5_val BINARY(16), ...);
INSERT INTO md5_tbl (md5_val, ...) VALUES(UNHEX(MD5('abcdef')), ...);
응용 프로그램은 해싱 함수가 두 개의 다른 입력 값에 대해 동일한 값을 생성하는 아주 드문 경우를 처리 할 수 있도록 준비해야합니다. 충돌을 탐지 할 수있는 한 가지 방법은 해시 열을 기본 키로 만드는 것입니다.
MD5 및 SHA-1 알고리즘에 대한 악용 사례가 알려졌습니다. 이 절에 설명 된 다른 단방향 암호화 기능 (예 :)을 대신 사용해보십시오 SHA2()
.
암호화 기능에 대한 인수로 제공된 암호 또는 기타 민감한 값은 SSL 연결이 사용되지 않는 한 일반 텍스트로 MySQL 서버로 보내집니다. 또한 이러한 값은 작성된 MySQL 로그에 나타납니다. 이러한 유형의 노출을 피하기 위해 응용 프로그램은 서버로 보내기 전에 클라이언트 측에서 중요한 값을 암호화 할 수 있습니다. 암호화 키에도 동일한 고려 사항이 적용됩니다. 이들을 노출시키지 않기 위해 응용 프로그램은 저장 프로 시저를 사용하여 서버 측에서 값을 암호화하고 암호 해독 할 수 있습니다.
AES_DECRYPT(
crypt_str
,key_str
[,init_vector
])이 기능은 공식 AES (Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 암호 해독합니다. 자세한 내용은의 설명을 참조하십시오
AES_ENCRYPT()
.선택적 초기화 벡터 인수
init_vector
. 사용AES_DECRYPT()
하는 문은 명령문 기반 복제에 안전하지 않습니다.AES_ENCRYPT(
str
,key_str
[,init_vector
])AES_ENCRYPT()
및AES_DECRYPT()
암호화 및 공식 AES 이전으로 알려진 (고급 암호화 표준) 알고리즘을 사용하여 데이터의 암호 해독 구현 " Rijndael을합니다. "AES 표준은 다양한 키 길이를 허용합니다. 기본적으로이 함수는 128 비트 키 길이의 AES를 구현합니다. 나중에 설명하는 것처럼 196 또는 256 비트의 키 길이를 사용할 수 있습니다. 키 길이는 성능과 보안 사이의 균형입니다.AES_ENCRYPT()
str
키 문자열을 사용하여key_str
문자열을 암호화하고 암호화 된 출력을 포함하는 2 진 문자열을 리턴합니다. 키AES_DECRYPT()
문자열을crypt_str
사용하여 암호화 된 문자열 을 암호 해독하고key_str
원래 일반 텍스트 문자열을 반환합니다. 함수 인수가 false이면NULL
함수가 반환NULL
됩니다.str
및crypt_str
인수는 임의의 길이 일 수 있고, 패딩을 자동으로 추가str
는 예컨대 AES 등의 블록 - 기반의 알고리즘에서 요구 한 블록의 배수가되도록. 이 패딩은AES_DECRYPT()
함수에 의해 자동으로 제거됩니다 . 길이는crypt_str
다음 공식을 사용하여 계산할 수 있습니다.16 * (trunc(string_length / 16) + 1)
128 비트의 키 길이의 경우,
key_str
인수에 키를 전달하는 가장 안전한 방법 은 진정한 랜덤 128 비트 값을 생성하여 이진 값으로 전달하는 것입니다. 예 :INSERT INTO t VALUES (1,AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));
패스 프레이즈는 패스 프레이즈를 해싱하여 AES 키를 생성하는 데 사용할 수 있습니다. 예 :
INSERT INTO t VALUES (1,AES_ENCRYPT('text', UNHEX(SHA2('My secret passphrase',512))));
암호 나 암호를 직접 전달하지 말고
crypt_str
해시하십시오. 이 문서의 이전 버전에서는 이전 방법을 제안했지만, 여기에 표시된 예는보다 안전하기 때문에 더 이상 권장되지 않습니다.경우
AES_DECRYPT()
유효하지 않은 데이터 또는 잘못된 패딩을 감지, 그것은 반환합니다NULL
. 그러나 입력 데이터 또는 키가 유효하지 않은 경우AES_DECRYPT()
비NULL
값 (가비지 일 수도 있음) 을 반환 할 수 있습니다.AES_ENCRYPT()
및AES_DECRYPT()
블록 암호화 모드의 제어를 허용하고 옵션 걸릴init_vector
초기화 벡터 인수를 :block_encryption_mode
시스템 변수 블록 기반 암호화 알고리즘의 모드를 제어한다. 기본값aes-128-ecb
은 128 비트의 키 길이와 ECB 모드를 사용하여 암호화를 의미합니다. 이 변수의 허용 값에 대한 설명은 5.1.8 절. "서버 시스템 변수" 에서 참조하십시오 .선택적
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) | +-----------------------------------------------+ | text | +-----------------------------------------------+
다음 표는 허용 된 각 블록 암호화 모드,이를 지원하는 SSL 라이브러리 및 초기화 벡터 인수가 필요한지 여부를 나열합니다.
암호화 모드 차단 모드를 지원하는 SSL 라이브러리 초기화 벡터 필요 ECB OpenSSL, wolfSSL 아니 CBC OpenSSL, wolfSSL 예 CFB1 OpenSSL 예 CFB8 OpenSSL 예 CFB128 OpenSSL 예 OFB OpenSSL 예 명령문 기반 복제 를 사용
AES_ENCRYPT()
하거나AES_DECRYPT()
안전하지 않은 명령문.문자열을 압축하고 결과를 2 진 문자열로 리턴합니다. 이 함수는 MySQL이와 같은 압축 라이브러리로 컴파일 된 것을 요구한다
zlib
. 그렇지 않으면 반환 값은 항상NULL
입니다. 압축 된 문자열은로 압축을 풀 수 있습니다UNCOMPRESS()
.mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000))); -> 21 mysql> SELECT LENGTH(COMPRESS('')); -> 0 mysql> SELECT LENGTH(COMPRESS('a')); -> 13 mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16))); -> 15
압축 된 문자열 내용은 다음과 같은 방식으로 저장됩니다.
빈 문자열은 빈 문자열로 저장됩니다.
비어 있지 않은 문자열은 4 바이트 길이의 압축되지 않은 문자열 (낮은 바이트부터)과 압축 된 문자열로 저장됩니다. 문자열이 공백으로 끝나면
.
결과를 aCHAR
또는VARCHAR
column에 저장해야하는 경우 endspace 트리밍 문제를 방지하기 위해 여분의 문자가 추가 됩니다. (단, 이진이 아닌 문자열 데이터 유형 등의 사용CHAR
또는VARCHAR
압축 된 문자열을 저장할는 문자 집합 변환이 발생할 수 있기 때문에 어쨌든 사용하지 않는 것이 좋습니다. 용도VARBINARY
나BLOB
대신 이진 문자열 열.)
이 함수는 MySQL 8.0.3에서 삭제되었다.
사용을 고려
AES_ENCRYPT()
하고AES_DECRYPT()
대신.DES_DECRYPT(
crypt_str
[,key_str
])이 함수는 MySQL 8.0.3에서 삭제되었다.
사용을 고려
AES_ENCRYPT()
하고AES_DECRYPT()
대신.DES_ENCRYPT(
str
[,{key_num
|key_str
}])이 함수는 MySQL 8.0.3에서 삭제되었다.
사용을 고려
AES_ENCRYPT()
하고AES_DECRYPT()
대신.이 함수는 MySQL 8.0.3에서 삭제되었다.
사용을 고려
AES_ENCRYPT()
하고AES_DECRYPT()
대신.이 함수는 MySQL 8.0.3에서 삭제되었다. 단방향 해싱의 경우
SHA2()
대신 사용하는 것이 좋습니다.문자열에 대한 MD5 128 비트 체크섬을 계산합니다. 이 값은 32 자리의 16 진수 문자열 또는
NULL
인수가있는 경우 반환됩니다NULL
. 반환 값은 예를 들어 해시 키로 사용할 수 있습니다. 해시 값을 효율적으로 저장하는 방법은이 섹션의 시작 부분에있는 노트를 참조하십시오.반환 값은 연결 문자 집합의 문자열입니다.
FIPS 모드가 활성화 된 경우
MD5()
반환NULL
됩니다. 6.6 절 . "FIPS 지원"을 참조하십시오 .mysql> SELECT MD5('testing'); -> 'ae2b1fca515949e5d54fb22b8ed95575'
이것은 " RSA Data Security, Inc. MD5 메시지 다이제스트 알고리즘"입니다. "
이 섹션의 시작 부분에있는 MD5 알고리즘 관련 참고 사항을 참조하십시오.
이 함수는 MySQL 8.0.11에서 삭제되었다.
이 함수는
len
SSL 라이브러리의 난수 생성기를 사용하여 생성 된 임의의 바이트 의 이진 문자열을 반환합니다 .len
1 ~ 1024 범위의 허용 된 값입니다 . 해당 범위를 벗어난 값의RANDOM_BYTES()
경우 경고를 생성하고 반환합니다NULL
.RANDOM_BYTES()
함수AES_DECRYPT()
및AES_ENCRYPT()
함수에 대한 초기화 벡터를 제공하는 데 사용할 수 있습니다 . 해당 컨텍스트에서 사용len
하려면 16 이상이어야합니다. 더 큰 값은 허용되지만 16을 초과하는 바이트는 무시됩니다.RANDOM_BYTES()
임의의 값을 생성하여 결과를 비 결정적으로 만듭니다. 따라서이 함수를 사용하는 문은 문 기반 복제에 안전하지 않습니다.RFC 3174 (Secure Hash Algorithm)에 설명 된대로 문자열에 대한 SHA-1 160 비트 체크섬을 계산합니다. 이 값은 40 개의 16 진수 문자열 또는
NULL
인수가있는 경우반환됩니다NULL
. 이 함수의 가능한 용도 중 하나는 해시 키입니다. 해시 값을 효율적으로 저장하는 방법은이 섹션의 시작 부분에있는 노트를 참조하십시오.SHA()
동의어입니다SHA1()
.반환 값은 연결 문자 집합의 문자열입니다.
mysql> SELECT SHA1('abc'); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()
암호 학적으로 더 안전한 것으로 간주 될 수 있습니다MD5()
. 그러나이 섹션의 시작 부분에있는 MD5 및 SHA-1 알고리즘에 대한 참고 사항을 참조하십시오.SHA-2 계열의 해시 함수 (SHA-224, SHA-256, SHA-384 및 SHA-512)를 계산합니다. 첫 번째 인수는 해시 할 일반 텍스트 문자열입니다. 두 번째 인수는 결과의 원하는 비트 길이를 나타내며 값은 224, 256, 384, 512 또는 0 (256과 동일)이어야합니다. 인수가 하나
NULL
이거나 해시 길이가 허용되는 값 중 하나가 아니면 반환 값은NULL
입니다. 그렇지 않으면 함수 결과는 원하는 비트 수를 포함하는 해시 값입니다. 해시 값을 효율적으로 저장하는 방법은이 섹션의 시작 부분에있는 노트를 참조하십시오.반환 값은 연결 문자 집합의 문자열입니다.
mysql> SELECT SHA2('abc', 224); -> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
이 함수는 MySQL이 SSL을 지원하도록 구성된 경우에만 작동합니다. 참조 "암호화 된 연결을 사용하여"6.4 절 .
SQL 문을 문자열로 지정하면 연결 문자 집합에있는 문 자열 다이제스트 해시 값을 문자열로 반환하거나
NULL
인수가NULL
. 관련STATEMENT_DIGEST_TEXT()
함수는 정규화 된 문 요약을 반환합니다. 명령문 다이제스트에 대한 자세한 내용은 26.10 절. "성능 스키마 문 다이제스트 및 샘플링"을 참조하십시오 .두 함수 모두 MySQL 구문 분석기를 사용하여 구문을 구문 분석합니다. 구문 분석에 실패하면 오류가 발생합니다. 오류 메시지에는 문이 리터럴 문자열로 제공되는 경우에만 구문 분석 오류가 포함됩니다.
max_digest_length
시스템 변수 정규화 진술 다이제스트를 계산하기위한 이러한 기능을 이용할 수있는 최대 바이트 수를 결정한다.mysql> SET @stmt = 'SELECT * FROM mytable WHERE cola = 10 AND colb = 20'; mysql> SELECT STATEMENT_DIGEST(@stmt); +------------------------------------------------------------------+ | STATEMENT_DIGEST(@stmt) | +------------------------------------------------------------------+ | 3bb95eeade896657c4526e74ff2a2862039d0a0fe8a9e7155b5fe492cbd78387 | +------------------------------------------------------------------+ mysql> SELECT STATEMENT_DIGEST_TEXT(@stmt); +----------------------------------------------------------+ | STATEMENT_DIGEST_TEXT(@stmt) | +----------------------------------------------------------+ | SELECT * FROM `mytable` WHERE `cola` = ? AND `colb` = ? | +----------------------------------------------------------+
STATEMENT_DIGEST_TEXT(
statement
)SQL 문을 문자열로 지정하면 정규화 된 문 다이제스트를 연결 문자 집합의 문자열로 반환하거나
NULL
인수가NULL
. 추가 토론 및 예는 관련STATEMENT_DIGEST()
기능에 대한 설명을 참조하십시오 .UNCOMPRESS(
string_to_uncompress
)COMPRESS()
함수로 압축 된 문자열의 압축을 풉니 다 . 인수가 압축 된 값이 아니면 결과는 다음과 같습니다NULL
. 이 함수는 MySQL이와 같은 압축 라이브러리로 컴파일 된 것을 요구한다zlib
. 그렇지 않으면 반환 값은 항상NULL
입니다.mysql> SELECT UNCOMPRESS(COMPRESS('any string')); -> 'any string' mysql> SELECT UNCOMPRESS('any string'); -> NULL
UNCOMPRESSED_LENGTH(
compressed_string
)압축 전의 압축 캐릭터 라인의 길이를 돌려줍니다.
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30))); -> 30
VALIDATE_PASSWORD_STRENGTH(
str
)평문 패스워드를 나타내는 인수가 주어지면,이 함수는 패스워드가 얼마나 강한지를 나타내는 정수를 반환합니다. 반환 값의 범위는 0 (약) ~ 100 (강함)입니다.
비밀번호 평가 기준
VALIDATE_PASSWORD_STRENGTH()
은validate_password
구성 요소에서 수행합니다 . 해당 구성 요소가 설치되어 있지 않으면 함수는 항상 0을 반환합니다. 설치에 대한 자세한 내용은 6.5.3 절 . "암호 유효성 검사 구성 요소"를validate_password
참조하십시오 . 암호 테스트에 영향을주는 매개 변수를 검사하거나 구성하려면에 의해 구현 된 시스템 변수를 확인하거나 설정하십시오 . 참조 섹션 6.5.3.2, "비밀번호 확인 옵션 및 변수"를 .validate_password
암호는 점점 더 엄격한 검사를 받게되고 반환 값은 다음 표에 표시된 것처럼 어떤 검사가 만족되었는지를 반영합니다. 또한
validate_password.check_user_name
시스템 변수가 사용 가능하고 암호가 사용자 이름과 일치하면VALIDATE_PASSWORD_STRENGTH()
다른validate_password
시스템 변수가 설정되는 방} 과 관계없이 0을 리턴합니다 .비밀번호 테스트 반환 값 길이 <4 0 길이 ≥ 4 및 < validate_password.length
25 명 만족 정책 1 ( LOW
)50 개 만족 정책 2 ( MEDIUM
)75 만족 정책 3 ( STRONG
)100 - REFERER : https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html
'Databases > mariaDB & Mysql' 카테고리의 다른 글
Mysql 원격에서 접속하는 방법 (0) | 2019.01.14 |
---|