Loading...
MySQL 9.5 Reference Manual 9.5의 14.13 Encryption and Compression Functions의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Table 14.18 Encryption Functions
| Name | Description | Deprecated |
|---|---|---|
AES_DECRYPT() | AES를 사용하여 복호화 | |
AES_ENCRYPT() | AES를 사용하여 암호화 | |
COMPRESS() | 결과를 바이너리 문자열로 반환 | |
MD5() | MD5 체크섬 계산 | Yes |
RANDOM_BYTES() | 랜덤 바이트 벡터 반환 | |
SHA1(), SHA() | SHA-1 160-bit 체크섬 계산 | Yes |
SHA2() | SHA-2 체크섬 계산 | |
STATEMENT_DIGEST() | 스테이트먼트 다이제스트 해시 값 계산 | |
STATEMENT_DIGEST_TEXT() | 정규화된 스테이트먼트 다이제스트 계산 | |
UNCOMPRESS() | 압축된 문자열을 압축 해제 | |
UNCOMPRESSED_LENGTH() | 압축 전 문자열의 길이를 반환 | |
VALIDATE_PASSWORD_STRENGTH() | 패스워드의 강도 판별 |
| Name | Description | Deprecated |
|---|
많은 암호화 및 압축 함수는 결과로 임의의 바이트 값을 포함할 수 있는 문자열을 반환합니다. 이러한 결과를 저장하려면, VARBINARY 또는 BLOB 바이너리 문자열 데이터 타입의 컬럼을 사용하십시오. 이렇게 하면 뒤따르는 공백 제거 또는 문자 집합 변환으로 인해 데이터 값이 변경되는 잠재적 문제를 피할 수 있습니다.
이러한 문제는 CHAR, VARCHAR, TEXT와 같은 비바이너리 문자열 데이터 타입을 사용할 경우 발생할 수 있습니다.
일부 암호화 함수는 ASCII 문자로 구성된 문자열을 반환합니다: MD5(), SHA(), SHA1(), SHA2(), STATEMENT_DIGEST(), STATEMENT_DIGEST_TEXT().
이들 반환 값은 문자 집합과 콜레이션을 가지는 문자열이며, 이는 character_set_connection 및 collation_connection 시스템 변수에 의해 결정됩니다. 문자 집합이 binary가 아닌 한 이는 비바이너리 문자열입니다.
MD5() 또는 SHA1()처럼 16진수 숫자 문자열을 반환하는 함수를 애플리케이션이 저장하는 경우, 16진수 표현을 UNHEX()를 사용해 바이너리로 변환하고, 그 결과를 BINARY(N) 컬럼에 저장하면 더 효율적인 저장과 비교를 할 수 있습니다.
각 2개의 16진수 숫자는 바이너리 형식에서 1바이트가 필요하므로, N 의 값은 16진수 문자열의 길이에 따라 달라집니다. MD5() 값의 경우 N 은 16이고, SHA1() 값의 경우 20입니다. SHA2()의 경우, N 은 결과의 비트 길이를 지정하는 인자에 따라 28에서 32까지 범위입니다.
CHAR 컬럼에 16진수 문자열을 저장하는 경우 저장 공간 패널티는 최소 두 배이며, 값이 각 문자가 4바이트를 사용하는 utf8mb4 문자 집합을 사용하는 컬럼에 저장되면 최대 8배까지 증가합니다. 또한, 값이 더 커지고 문자 집합 콜레이션 규칙을 고려해야 하므로 문자열 저장은 더 느린 비교를 초래합니다.
애플리케이션이 MD5() 문자열 값을 CHAR(32) 컬럼에 저장한다고 가정합시다:
1CREATE TABLE md5_tbl (md5_val CHAR(32), ...); 2INSERT INTO md5_tbl (md5_val, ...) VALUES(MD5('abcdef'), ...);
16진수 문자열을 더 컴팩트한 형식으로 변환하려면, 애플리케이션을 수정하여 다음과 같이 UNHEX()와 BINARY(16)을 대신 사용합니다:
1CREATE TABLE md5_tbl (md5_val BINARY(16), ...); 2INSERT INTO md5_tbl (md5_val, ...) VALUES(UNHEX(MD5('abcdef')), ...);
애플리케이션은 해싱 함수가 서로 다른 두 입력 값에 대해 동일한 값을 생성하는 매우 드문 경우를 처리할 준비가 되어 있어야 합니다. 충돌을 감지 가능하게 만드는 한 가지 방법은 해시 컬럼을 기본 키로 만드는 것입니다.
참고
MD5 및 SHA-1 알고리즘에 대한 익스플로잇이 알려져 있습니다. 대신 이 절에 설명된 다른 일방향 암호화 함수, 예를 들어 SHA2()를 사용하는 것을 고려할 수 있습니다.
MD5와 SHA-1 모두 더 이상 사용되지 않으며(deprecated), 대신 SHA2()를 권장합니다.
주의
암호화 함수의 인자로 제공되는 패스워드 또는 기타 민감한 값은 SSL 연결을 사용하지 않는 한 MySQL 서버로 평문(cleartext)으로 전송됩니다. 또한, 이러한 값은 기록되는 모든 MySQL 로그에 나타납니다. 이러한 유형의 노출을 피하려면, 애플리케이션에서 서버로 값을 보내기 전에 클라이언트 측에서 민감한 값을 암호화할 수 있습니다.
동일한 고려 사항이 암호화 키에도 적용됩니다. 이를 노출하지 않으려면, 애플리케이션에서 스토어드 프로시저를 사용해 서버 측에서 값을 암호화 및 복호화할 수 있습니다.
이 함수는 공식 AES(Advanced Encryption Standard) 알고리즘을 사용하여 데이터를 복호화합니다. 자세한 내용은 AES_ENCRYPT()에 대한 설명을 참조하십시오.
AES_DECRYPT()를 사용하는 스테이트먼트는 스테이트먼트 기반 복제에 대해 unsafe합니다.
AES_ENCRYPT()와 AES_DECRYPT()는 이전에 “Rijndael”로 알려졌던 공식 AES (Advanced Encryption Standard) 알고리즘을 사용하여 데이터의 암호화와 복호화를 구현합니다. AES 표준은 다양한 키 길이를 허용합니다. 기본적으로 이들 함수는 128비트 키 길이를 가진 AES를 구현합니다.
나중에 설명된 대로 196 또는 256비트의 키 길이를 사용할 수 있습니다. 키 길이는 성능과 보안 간의 절충입니다.
AES_ENCRYPT()는 문자열 str 을 키 문자열 key_str 를 사용하여 암호화하고, 암호화된 출력이 포함된 바이너리 문자열을 반환합니다. AES_DECRYPT()는 암호화된 문자열 crypt_str 을 키 문자열 key_str 를 사용해 복호화하고, 원래의 (바이너리) 문자열을 16진수 형식으로 반환합니다.
(평문으로 문자열을 얻으려면 결과를 CHAR로 캐스트하십시오. 또는, 모든 바이너리 값이 텍스트로 표시되도록 mysql 클라이언트를 --skip-binary-as-hex 옵션과 함께 시작하십시오.) 어느 하나의 함수 인자가 NULL이면, 함수는 NULL을 반환합니다.
AES_DECRYPT()가 잘못된 데이터 또는 잘못된 패딩을 감지하면 NULL을 반환합니다. 그러나, 입력 데이터 또는 키가 잘못된 경우에도 AES_DECRYPT()가 (non-NULL인) 값을 반환할 수 있으며, 이 값은 의미 없는 값일 수 있습니다.
이들 함수는 키 유도 함수(KDF)를 사용하여 key_str 에 전달된 정보로부터 암호학적으로 강한 비밀 키를 생성하는 것을 지원합니다. 파생된 키는 데이터를 암호화 및 복호화하는 데 사용되며, MySQL 서버 인스턴스 내에 유지되고 사용자에게는 접근할 수 없습니다.
KDF 사용은 함수 사용 시 보다 단순한 방법으로 키를 직접 만들거나 파생시키는 것보다 더 나은 보안을 제공하므로 강력히 권장됩니다. 함수는 HKDF(OpenSSL 1.1.0부터 사용 가능)를 지원하며, 여기서 키잉 머티리얼에 포함할 선택적 솔트와 컨텍스트 기반 정보를 지정할 수 있고, PBKDF2(OpenSSL 1.0.2부터 사용 가능)를 지원하며, 여기서 선택적 솔트를 지정하고 키를 생성하는 데 사용되는 반복(iteration) 수를 설정할 수 있습니다.
AES_ENCRYPT()와 AES_DECRYPT()는 블록 암호화 모드를 제어할 수 있도록 허용합니다. block_encryption_mode 시스템 변수는 블록 기반 암호화 알고리즘의 모드를 제어합니다.
이 변수의 기본값은 aes-128-ecb이며, 이는 128비트 키 길이와 ECB 모드를 사용하는 암호화를 의미합니다. 이 변수의 허용 값에 대한 설명은 Section 7.1.8, “Server System Variables”를 참조하십시오. 선택적 init_vector 인자는 블록 암호화 모드 중 초기화 벡터를 요구하는 모드에 대해 초기화 벡터를 제공하는 데 사용됩니다.
AES_ENCRYPT() 또는 AES_DECRYPT()를 사용하는 스테이트먼트는 스테이트먼트 기반 복제에 대해 unsafe합니다.
mysql 클라이언트 내에서 AES_ENCRYPT()가 호출되는 경우, 바이너리 문자열은 --binary-as-hex의 값에 따라 16진수 표기법을 사용해 표시됩니다. 이 옵션에 대한 자세한 내용은 Section 6.5.1, “mysql — The MySQL Command-Line Client”를 참조하십시오.
AES_ENCRYPT() 및 AES_DECRYPT() 함수의 인자는 다음과 같습니다:
str
AES_ENCRYPT()가 키 문자열 key_str 또는 지정된 KDF에 의해 여기서 파생된 키를 사용하여 암호화할 문자열입니다. 문자열 길이는 아무 길이나 될 수 있습니다. 블록 기반 알고리즘(예: AES)이 요구하는 대로, str 이 블록의 배수가 되도록 패딩이 자동으로 추가됩니다. 이 패딩은 AES_DECRYPT() 함수에 의해 자동으로 제거됩니다.
crypt_str
AES_DECRYPT()가 키 문자열 key_str 또는 지정된 KDF에 의해 여기서 파생된 키를 사용해 복호화할 암호화된 문자열입니다. 문자열 길이는 아무 길이나 될 수 있습니다. crypt_str 의 길이는 원래 문자열의 길이로부터 다음 공식을 사용하여 계산할 수 있습니다:
116 * (trunc(string_length / 16) + 1)
key_str
암호화 키, 또는 키 유도 함수(KDF)를 사용하여 키를 파생시키는 기반으로 사용되는 입력 키잉 머티리얼입니다. 동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 동일한 key_str 값을 사용하십시오.
KDF를 사용하는 경우, key_str 은 패스워드 또는 패스프레이즈와 같이 임의의 정보가 될 수 있습니다. 이 함수의 이후 인자에서 KDF 이름을 지정한 다음, 해당 KDF에 적합한 보안 강화를 위해 추가 옵션을 추가합니다.
KDF를 사용하면, 함수는 key_str 에 전달된 정보와 다른 인자에 제공한 솔트 또는 추가 정보를 기반으로 암호학적으로 강한 비밀 키를 생성합니다. 파생된 키는 데이터를 암호화 및 복호화하는 데 사용되며, MySQL 서버 인스턴스 내에 유지되고 사용자에게는 접근할 수 없습니다. KDF 사용은 함수 사용 시 보다 단순한 방법으로 키를 직접 지정하거나 파생시키는 것보다 더 나은 보안을 제공하므로 강력히 권장됩니다.
KDF를 사용하지 않는 경우, 128비트 키 길이의 경우 key_str 인자에 키를 전달하는 가장 안전한 방법은 진짜 랜덤 128비트 값을 생성하여 이를 바이너리 값으로 전달하는 것입니다. 예를 들어:
1INSERT INTO t 2VALUES (1,AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')));
패스프레이즈는 해싱을 통해 AES 키를 생성하는 데 사용할 수 있습니다. 예를 들어:
1INSERT INTO t 2VALUES (1,AES_ENCRYPT('text', UNHEX(SHA2('My secret passphrase',512))));
최대 키 길이 128비트를 초과하면 경고가 반환됩니다. KDF를 사용하지 않는 경우, 패스워드 또는 패스프레이즈를 key_str 에 직접 전달하지 말고, 먼저 해시 처리하십시오. 이전 버전의 이 문서에서는 전자의 접근 방식을 제안했지만, 이제는 여기에서 제시된 예제가 더 안전하므로 더 이상 권장되지 않습니다.
init_vector
블록 암호화 모드 중 초기화 벡터를 요구하는 모드에 대한 초기화 벡터입니다. block_encryption_mode 시스템 변수는 모드를 제어합니다. 동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 대해 동일한 init_vector 값을 사용하십시오.
참고
KDF를 사용하는 경우, 이후 인자에서 KDF를 정의하기 위해 초기화 벡터 또는 널 문자열을 이 인자에 지정해야 합니다.
초기화 벡터를 필요로 하는 모드의 경우, 길이는 16바이트 이상이어야 합니다(16을 초과하는 바이트는 무시됩니다). init_vector 가 누락되면 에러가 발생합니다. 초기화 벡터를 필요로 하지 않는 모드의 경우, 이 값은 무시되며 init_vector 가 지정되면 경고가 생성됩니다(KDF를 사용하지 않는 경우).
block_encryption_mode 시스템 변수의 기본값은 초기화 벡터가 필요 없는 ECB 모드인 aes-128-ecb 입니다. 허용되는 대체 블록 암호화 모드인 CBC, CFB1, CFB8, CFB128 및 OFB는 모두 초기화 벡터를 필요로 합니다.
초기화 벡터로 사용할 랜덤 바이트 문자열은 RANDOM_BYTES(16)를 호출하여 생성할 수 있습니다.
kdf_name
입력 키잉 머티리얼 key_str 및 KDF에 적합한 다른 인자로부터 키를 생성하기 위해 사용하는 키 유도 함수(KDF)의 이름입니다. 선택적입니다.
동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 대해 동일한 kdf_name 값을 사용하십시오. kdf_name 을 지정하는 경우, 암호화 모드가 초기화 벡터를 필요로 하지 않는다면 널 문자열을 사용하거나, 필요한 경우 유효한 초기화 벡터를 사용하여 init_vector 를 지정해야 합니다.
다음 값이 지원됩니다:
hkdf
HKDF로, OpenSSL 1.1.0부터 사용 가능합니다. HKDF는 키잉 머티리얼에서 의사난수 키를 추출한 다음, 이를 추가 키로 확장합니다. HKDF에서는 선택적 솔트(salt)와 키잉 머티리얼에 포함할 애플리케이션 세부 정보와 같은 컨텍스트 기반 정보(info)를 지정할 수 있습니다.
pbkdf2_hmac
PBKDF2로, OpenSSL 1.0.2부터 사용 가능합니다. PBKDF2는 키잉 머티리얼에 의사난수 함수를 적용하고, 이 과정을 많은 횟수 반복하여 키를 생성합니다. PBKDF2에서는 키잉 머티리얼에 포함할 선택적 솔트(salt)를 지정할 수 있고, 키를 생성하는 데 사용되는 반복 수(iterations)를 설정할 수 있습니다.
다음 예에서는, 키 유도 함수로 HKDF가 지정되고, 솔트와 컨텍스트 정보가 제공됩니다. 초기화 벡터에 대한 인자는 포함되지만 빈 문자열입니다:
1SELECT AES_ENCRYPT('mytext','mykeystring', '', 'hkdf', 'salt', 'info');
다음 예에서는, 키 유도 함수로 PBKDF2가 지정되고, 솔트가 제공되며, 반복 수는 권장 최소값의 두 배로 설정됩니다:
1SELECT AES_ENCRYPT('mytext','mykeystring', '', 'pbkdf2_hmac','salt', '2000');
salt
키 유도 함수(KDF)에 전달할 솔트입니다. 선택적입니다. HKDF와 PBKDF2 모두 솔트를 사용할 수 있으며, 이는 일반적인 패스워드 사전이나 레인보우 테이블을 기반으로 한 공격을 방지하는 데 도움이 되므로 사용이 권장됩니다.
솔트는 랜덤 데이터로 구성되며, 보안을 위해 각 암호화 작업마다 달라야 합니다. 솔트로 사용할 랜덤 바이트 문자열은 RANDOM_BYTES()를 호출하여 생성할 수 있습니다. 다음 예는 64비트 솔트를 생성합니다:
1SET @salt = RANDOM_BYTES(8);
동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 대해 동일한 salt 값을 사용하십시오. 솔트는 암호화된 데이터와 함께 안전하게 저장할 수 있습니다.
info
HKDF가 키잉 머티리얼에 포함할 애플리케이션에 대한 정보 등 컨텍스트 기반 정보입니다. 선택적이며, KDF 이름으로 hkdf 를 지정했을 때 사용 가능합니다. HKDF는 키를 생성하기 위해 key_str 에 지정된 키잉 머티리얼 및 salt 에 지정된 솔트에 이 정보를 추가합니다.
동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 대해 동일한 info 값을 사용하십시오.
iterations
PBKDF2가 키를 생성할 때 사용할 반복 수입니다. 선택적이며, KDF 이름으로 pbkdf2_hmac 를 지정했을 때 사용 가능합니다. 높은 반복 수는 공격자에게 더 큰 계산 비용을 요구하므로 무차별 대입 공격(brute-force attack)에 대한 저항성을 높이지만, 키 유도 과정에도 동일하게 더 큰 비용이 필요하게 됩니다.
이 인자를 지정하지 않으면 기본값은 1000이며, 이는 OpenSSL 표준에서 권장하는 최소값입니다.
동일한 데이터 인스턴스에 대해서는, AES_ENCRYPT()에 의한 암호화와 AES_DECRYPT()에 의한 복호화에 대해 동일한 iterations 값을 사용하십시오.
1mysql> SET block_encryption_mode = 'aes-256-cbc'; 2mysql> SET @key_str = SHA2('My secret passphrase',512); 3mysql> SET @init_vector = RANDOM_BYTES(16); 4mysql> SET @crypt_str = AES_ENCRYPT('text',@key_str,@init_vector); 5mysql> SELECT CAST(AES_DECRYPT(@crypt_str,@key_str,@init_vector) AS CHAR); 6+-------------------------------------------------------------+ 7| CAST(AES_DECRYPT(@crypt_str,@key_str,@init_vector) AS CHAR) | 8+-------------------------------------------------------------+ 9| text | 10+-------------------------------------------------------------+
문자열을 압축하고 결과를 바이너리 문자열으로 반환합니다. 이 함수는 zlib 과 같은 압축 라이브러리로 MySQL이 컴파일되어 있어야 합니다. 그렇지 않으면 반환 값은 항상 NULL입니다. string_to_compress 가 NULL인 경우에도 반환 값은 NULL입니다. 압축된 문자열은 UNCOMPRESS()로 압축 해제할 수 있습니다.
1mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000))); 2 -> 21 3mysql> SELECT LENGTH(COMPRESS('')); 4 -> 0 5mysql> SELECT LENGTH(COMPRESS('a')); 6 -> 13 7mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16))); 8 -> 15
압축된 문자열의 내용은 다음과 같이 저장됩니다:
빈 문자열은 빈 문자열으로 저장됩니다.
비어 있지 않은 문자열은 압축되지 않은 문자열의 4바이트 길이(하위 바이트가 먼저 옴)와 압축된 문자열이 뒤따라 저장됩니다. 문자열이 공백으로 끝나는 경우, 결과가 CHAR 또는 VARCHAR 컬럼에 저장될 때 끝 공백 제거 문제를 피하기 위해 추가로 . 문자가 추가됩니다. (그러나, 압축된 문자열을 저장하는 데 CHAR 또는 VARCHAR와 같은 비바이너리 문자열 데이터 타입을 사용하는 것은, 문자 집합 변환이 발생할 수 있으므로, 어느 경우에나 권장되지 않습니다. 대신 VARBINARY 또는 BLOB 바이너리 문자열 컬럼을 사용하십시오.)
mysql 클라이언트 내에서 COMPRESS()가 호출되는 경우, 바이너리 문자열은 --binary-as-hex의 값에 따라 16진수 표기법을 사용해 표시됩니다. 이 옵션에 대한 자세한 내용은 Section 6.5.1, “mysql — The MySQL Command-Line Client”를 참조하십시오.
Deprecated; 대신 SHA2()를 권장합니다. 문자열에 대한 MD5 128비트 체크섬을 계산합니다. 값은 32개의 16진수 숫자로 구성된 문자열으로 반환되며, 인자가 NULL이면 NULL이 반환됩니다. 예를 들어, 반환 값은 해시 키로 사용할 수 있습니다. 해시 값을 효율적으로 저장하는 방법에 대해서는 이 절의 앞부분에 있는 설명을 참조하십시오.
반환 값은 커넥션 문자 집합의 문자열입니다.
FIPS 모드가 활성화되어 있으면, MD5()는 NULL을 반환합니다. Section 8.8, “FIPS Support”를 참조하십시오.
1mysql> SELECT MD5('testing'); 2 -> 'ae2b1fca515949e5d54fb22b8ed95575'
이는 “RSA Data Security, Inc. MD5 Message-Digest Algorithm”입니다.
이 절의 시작 부분에 있는 MD5 알고리즘에 대한 노트를 참조하십시오.
이 함수는 SSL 라이브러리의 난수 생성기를 사용해 생성된 len 개의 랜덤 바이트로 구성된 바이너리 문자열을 반환합니다. 허용되는 len 값은 1에서 1024까지입니다. 이 범위를 벗어나는 값에 대해서는 에러가 발생합니다. len 이 NULL이면 NULL을 반환합니다.
RANDOM_BYTES()는 AES_DECRYPT() 및 AES_ENCRYPT() 함수의 초기화 벡터를 제공하는 데 사용할 수 있습니다. 이 용도로 사용할 경우, len 은 최소 16이어야 합니다. 더 큰 값도 허용되지만, 16을 초과하는 바이트는 무시됩니다.
RANDOM_BYTES()는 랜덤 값을 생성하므로 결과는 비결정적(nondeterministic)입니다. 따라서, 이 함수를 사용하는 스테이트먼트는 스테이트먼트 기반 복제에 대해 unsafe합니다.
mysql 클라이언트 내에서 RANDOM_BYTES()가 호출되는 경우, 바이너리 문자열은 --binary-as-hex의 값에 따라 16진수 표기법을 사용해 표시됩니다. 이 옵션에 대한 자세한 내용은 Section 6.5.1, “mysql — The MySQL Command-Line Client”를 참조하십시오.
Deprecated; 대신 SHA2()를 사용하십시오. RFC 3174(Secure Hash Algorithm)에 설명된 대로, 문자열에 대한 SHA-1 160비트 체크섬을 계산합니다. 값은 40개의 16진수 숫자로 구성된 문자열으로 반환되거나, 인자가 NULL이면 NULL이 반환됩니다.
이 함수의 가능한 용도 중 하나는 해시 키로 사용하는 것입니다. 해시 값을 효율적으로 저장하는 방법에 대해서는 이 절의 앞부분에 있는 설명을 참조하십시오. SHA()는 SHA1()와 동의어입니다.
반환 값은 커넥션 문자 집합의 문자열입니다.
1mysql> SELECT SHA1('abc'); 2 -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()는 MD5()의 암호학적으로 더 안전한 동등물로 간주할 수 있습니다. 그러나, 이 절의 시작 부분에 있는 MD5 및 SHA-1 알고리즘에 대한 노트를 참조하십시오.
SHA-224, SHA-256, SHA-384 및 SHA-512의 SHA-2 계열 해시 함수를 계산합니다. 첫 번째 인자는 해시할 평문 문자열입니다. 두 번째 인자는 결과의 원하는 비트 길이를 나타내며, 값은 224, 256, 384, 512 또는 0(256과 동일) 중 하나여야 합니다.
둘 중 어느 인자라도 NULL이거나 해시 길이가 허용 값이 아니면, 반환 값은 NULL입니다. 그렇지 않으면 함수 결과는 원하는 비트 수를 포함하는 해시 값입니다. 해시 값을 효율적으로 저장하는 방법에 대해서는 이 절의 앞부분에 있는 설명을 참조하십시오.
반환 값은 커넥션 문자 집합의 문자열입니다.
1mysql> SELECT SHA2('abc', 224); 2 -> '23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7'
이 함수는 MySQL이 SSL 지원으로 구성된 경우에만 작동합니다. Section 8.3, “Using Encrypted Connections”를 참조하십시오.
SHA2()는 MD5() 또는 SHA1()보다 암호학적으로 더 안전한 것으로 간주될 수 있습니다.
문자열로 된 SQL 스테이트먼트가 주어지면, 스테이트먼트 다이제스트 해시 값을 커넥션 문자 집합의 문자열로 반환하거나, 인자가 NULL이면 NULL을 반환합니다. 관련 함수인 STATEMENT_DIGEST_TEXT()는 정규화된 스테이트먼트 다이제스트를 반환합니다.
스테이트먼트 다이제스트에 대한 정보는 Section 29.10, “Performance Schema Statement Digests and Sampling”를 참조하십시오.
두 함수 모두 MySQL 파서를 사용해 스테이트먼트를 파싱합니다. 파싱이 실패하면 에러가 발생합니다. 스테이트먼트가 리터럴 문자열으로 제공된 경우에만, 에러 메시지에 파싱 에러가 포함됩니다.
max_digest_length 시스템 변수는 이들 함수가 정규화된 스테이트먼트 다이제스트를 계산하는 데 사용할 수 있는 최대 바이트 수를 결정합니다.
1mysql> SET @stmt = 'SELECT * FROM mytable WHERE cola = 10 AND colb = 20'; 2mysql> SELECT STATEMENT_DIGEST(@stmt); 3+------------------------------------------------------------------+ 4| STATEMENT_DIGEST(@stmt) | 5+------------------------------------------------------------------+ 6| 3bb95eeade896657c4526e74ff2a2862039d0a0fe8a9e7155b5fe492cbd78387 | 7+------------------------------------------------------------------+ 8mysql> SELECT STATEMENT_DIGEST_TEXT(@stmt); 9+----------------------------------------------------------+ 10| STATEMENT_DIGEST_TEXT(@stmt) | 11+----------------------------------------------------------+ 12| SELECT * FROM `mytable` WHERE `cola` = ? AND `colb` = ? | 13+----------------------------------------------------------+
문자열로 된 SQL 스테이트먼트가 주어지면, 정규화된 스테이트먼트 다이제스트를 커넥션 문자 집합의 문자열로 반환하거나, 인자가 NULL이면 NULL을 반환합니다. 추가 설명과 예제는 관련 함수인 STATEMENT_DIGEST() 설명을 참조하십시오.
COMPRESS() 함수로 압축된 문자열의 압축을 해제합니다. 인자가 압축된 값이 아니면 결과는 NULL입니다; string_to_uncompress 가 NULL인 경우 결과 역시 NULL입니다.
이 함수는 zlib 과 같은 압축 라이브러리로 MySQL이 컴파일되어 있어야 합니다. 그렇지 않으면 반환 값은 항상 NULL입니다.
1mysql> SELECT UNCOMPRESS(COMPRESS('any string')); 2 -> 'any string' 3mysql> SELECT UNCOMPRESS('any string'); 4 -> NULL
압축되기 전 압축 문자열의 길이를 반환합니다. compressed_string 이 NULL이면 NULL을 반환합니다.
1mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30))); 2 -> 30
평문 패스워드를 나타내는 인자가 주어지면, 이 함수는 패스워드가 얼마나 강한지를 나타내는 정수를 반환하거나, 인자가 NULL이면 NULL을 반환합니다. 반환 값은 0(weak)에서 100(strong)까지 범위입니다.
VALIDATE_PASSWORD_STRENGTH()에 의한 패스워드 평가는 validate_password 컴포넌트에 의해 수행됩니다. 이 컴포넌트가 설치되어 있지 않으면, 함수는 항상 0을 반환합니다.
validate_password 설치에 대한 정보는 Section 8.4.4, “The Password Validation Component”를 참조하십시오. 패스워드 테스트에 영향을 미치는 파라미터를 확인하거나 설정하려면, validate_password가 구현하는 시스템 변수를 확인하거나 설정하십시오. Section 8.4.4.2, “Password Validation Options and Variables”를 참조하십시오.
패스워드는 점점 더 엄격한 테스트를 거치며, 반환 값은 다음 표에 표시된 대로 어떤 테스트가 충족되었는지를 반영합니다. 추가로, validate_password.check_user_name 시스템 변수가 활성화되어 있고 패스워드가 사용자 이름과 일치하는 경우, VALIDATE_PASSWORD_STRENGTH()는 다른 validate_password 시스템 변수 설정과 관계없이 0을 반환합니다.
| Password Test | Return Value |
|---|---|
| Length < 4 | 0 |
Length ≥ 4 and <<br> validate_password.length | 25 |
policy 1 (LOW) 충족 | 50 |
policy 2 (MEDIUM) 충족 | 75 |
policy 3 (STRONG) 충족 | 100 |
14.12 Bit Functions and Operators
14.14 Locking Functions