암호화 함수와 압축 함수
페이지 정보
작성자 오원장쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 4,475회 작성일 13-03-28 20:04본문
12.9.2. 암호화 함수와 압축 함수
이 섹션에서 나오는 함수는 암호화와 복호화, 그리고 압축과 압축 해지 기능을 담당하고 있다.
Note: 암호화 함수와 압축 함수는 바이너리 스트링을 결과 값으로 내 보낸다. 대부분의 이러한 함수들의 경우, 그 결과 값은 부정 (arbitrary) 바이트 값을 가지게 된다. 만일 이러한 값을 저장하고자 한다면, CHAR 또는 VARCHAR보다는 BLOB 컬럼을 사용해서 혹시 있을 수도 있는 트레일링 스페이스 제거와 같은 문제가 발생하지 않도록 하는 것이 좋다.
Note: MD5 와 SHA-1 알고리즘에 대한 내용은 이미 잘 알려져 있다. 여러분들이 이 섹션에서 언급하고 있는 알고리즘과는 다른 것을 사용할 수도 있을 것이다.
AES_ENCRYPT(str,key_str), AES_DECRYPT(crypt_str,key_str)
이 함수들은 이전에는 “Rijndael”이라고 불렸던 알고리즘인 AES (Advanced Encryption Standard) 알고리즘을 사용해서 데이터를 암호화/복호화를 한다. 128비트의 키 길이를 사용해서 암호화를 하지만, 여러분은 소스를 수정해서 258 비트까지 키의 길이를 늘릴 수도 있다. 우리는 128비트를 사용하는데, 이 크기가 성능면에서 가장 훌륭하고 또한 충분히 안전성을 보장하기 때문이다.
이 섹션에서 나오는 함수는 암호화와 복호화, 그리고 압축과 압축 해지 기능을 담당하고 있다.
Note: 암호화 함수와 압축 함수는 바이너리 스트링을 결과 값으로 내 보낸다. 대부분의 이러한 함수들의 경우, 그 결과 값은 부정 (arbitrary) 바이트 값을 가지게 된다. 만일 이러한 값을 저장하고자 한다면, CHAR 또는 VARCHAR보다는 BLOB 컬럼을 사용해서 혹시 있을 수도 있는 트레일링 스페이스 제거와 같은 문제가 발생하지 않도록 하는 것이 좋다.
Note: MD5 와 SHA-1 알고리즘에 대한 내용은 이미 잘 알려져 있다. 여러분들이 이 섹션에서 언급하고 있는 알고리즘과는 다른 것을 사용할 수도 있을 것이다.
AES_ENCRYPT(str,key_str), AES_DECRYPT(crypt_str,key_str)
이 함수들은 이전에는 “Rijndael”이라고 불렸던 알고리즘인 AES (Advanced Encryption Standard) 알고리즘을 사용해서 데이터를 암호화/복호화를 한다. 128비트의 키 길이를 사용해서 암호화를 하지만, 여러분은 소스를 수정해서 258 비트까지 키의 길이를 늘릴 수도 있다. 우리는 128비트를 사용하는데, 이 크기가 성능면에서 가장 훌륭하고 또한 충분히 안전성을 보장하기 때문이다.
AES_ENCRYPT()는 스트링을 암호화해서 바이너리 스트링으로 값을 리턴한다. AES_DESCRIPT()는 암호화된 스트링을 복호화한 다음에 원래의 스트링으로 리턴한다. 입력 인수의 길이는 크기가 상관이 없다. 만일 입력 인수가 NULL 이라면, 이 함수의 결과 값 역시 NULL 이 된다.
AES는 블록 레벨의 알고리즘이기 때문에, 일정하지 않은 크기의 스트링을 암호화 하기 위해서 패딩 (padding)을 사용하며, 따라서 그 결과 값 스트링은 아래의 공식을 사용해서 계산된다:
16 × (trunc(string_length / 16) + 1)
만일 AES_DECRYPT()가 옳지 않은 데이터 또는 틀린 패딩을 발견하면, NULL을 리턴한다. 하지만, 입력 데이터 또는 키가 올바르지 않을 경우라도 AES_DECRYPT()은 NULL 값이 아닌 값을 리턴할 가능성도 있다 (possibly garbage).
만일 AES_DECRYPT()가 옳지 않은 데이터 또는 틀린 패딩을 발견하면, NULL을 리턴한다. 하지만, 입력 데이터 또는 키가 올바르지 않을 경우라도 AES_DECRYPT()은 NULL 값이 아닌 값을 리턴할 가능성도 있다 (possibly garbage).
여러분은 아래와 같이 쿼리를 수정해서 암호화된 형태로 데이터를 저장하기 위해 AES 함수를 사용할 수가 있다:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT() 와 AES_DECRYPT() 함수는 MySQL이 현재 사용하고 있는 암호화 함수 중에 가장 안전한 것으로 생각을 해도 무방하다.
AES_ENCRYPT() 와 AES_DECRYPT() 함수는 MySQL이 현재 사용하고 있는 암호화 함수 중에 가장 안전한 것으로 생각을 해도 무방하다.
COMPRESS(string_to_compress)
스트링을 압축해서 그 결과를 바이너리 스트링으로 나타낸다. 이 함수는 MySQL이 zlib와 같은 압축 라이브러리를 사용해서 컴파일되어야 사용할 수 있다. 그렇지 않으면, 그 결과 값은 항상 NULL이 된다. 압축된 스트링은 UNCOMPRESS() 함수를 사용해서 풀 수가 있다.
스트링을 압축해서 그 결과를 바이너리 스트링으로 나타낸다. 이 함수는 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
압축된 스트링의 내용물은 아래의 방식으로 저장이 된다:
빈 스트링 (Empty strings)은 빈 스트링으로 저장된다.
비어있지 않은 스트링은 4 바이트 길이의 비 압축 스트링 (하위 바이트 우선)이 우선 저장되고, 그 다음에 압축된 스트링이 저장된다. 만일 스트링의 끝이 스페이스라면, 끝에 ‘.’ 문자를 추가해서 엔드스페이스 (endspace) 트리밍 문제가 발생하지 않도록 만든다. (압축된 스트링을 저장하기 위해서 CHAR 또는 VARCHAR 를 사용하는 것은 권장할 만한 것이 못 된다. 대신에, BLOB 컬럼을 사용하는 것이 좋다.)
DECODE(crypt_str,pass_str)
pass_str 를 패스워드 형태로 사용해서 암호화된 스트링 crypt_str를 푼다. crypt_str 는ENCODE()에서 리턴된 스트링이어야 한다.
-> 21
mysql> SELECT LENGTH(COMPRESS(''));
-> 0
mysql> SELECT LENGTH(COMPRESS('a'));
-> 13
mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16)));
-> 15
압축된 스트링의 내용물은 아래의 방식으로 저장이 된다:
빈 스트링 (Empty strings)은 빈 스트링으로 저장된다.
비어있지 않은 스트링은 4 바이트 길이의 비 압축 스트링 (하위 바이트 우선)이 우선 저장되고, 그 다음에 압축된 스트링이 저장된다. 만일 스트링의 끝이 스페이스라면, 끝에 ‘.’ 문자를 추가해서 엔드스페이스 (endspace) 트리밍 문제가 발생하지 않도록 만든다. (압축된 스트링을 저장하기 위해서 CHAR 또는 VARCHAR 를 사용하는 것은 권장할 만한 것이 못 된다. 대신에, BLOB 컬럼을 사용하는 것이 좋다.)
DECODE(crypt_str,pass_str)
pass_str 를 패스워드 형태로 사용해서 암호화된 스트링 crypt_str를 푼다. crypt_str 는ENCODE()에서 리턴된 스트링이어야 한다.
ENCODE(str,pass_str)
pass_str 를 패스워드로 사용해서 str를 암호화한다. 암호화된 결과 값을 풀기 위해서는, DECODE()를 사용한다.
pass_str 를 패스워드로 사용해서 str를 암호화한다. 암호화된 결과 값을 풀기 위해서는, DECODE()를 사용한다.
그 결과 값은 str의 바이너리 스트링과 같은 길이가 된다.
DES_DECRYPT(crypt_str[,key_str])
DES_ENCRYPT()로 암호화된 스트링을 푼다. 만일 에러가 발생한다면, 이 함수는 NULL을 리턴한다.
DES_ENCRYPT()로 암호화된 스트링을 푼다. 만일 에러가 발생한다면, 이 함수는 NULL을 리턴한다.
이 함수는 MySQL이 SSL을 지원하도록 구성되었을 경우에만 사용할 수 있다는 점을 알아두기 바란다.
Section 5.9.7, “Using Secure Connections”를 참조할 것
만일 어떠한 key_str 인수도 주어지지 않았다면, DES_DECRYPT()는 원래의 스트링을 암호화하기 위해 사용된 DES 키를 찾기 위해 암호화된 스트링의 맨 처음 바이트를 조사하며, 그런 다음에, 메시지의 암호를 풀기 위해 DES 키 파일에서 그 키 값을 읽어 온다. 이런 기능이 제대로 실행되기 위해서는, 사용자는 반드시 SUPER 권한을 가지고 있어야 한다. 키 파일은 --des-key-file 서버 옵션을 사용해서 지정할 수가 있다.
만일 여러분이 이 함수에 key_str 인수를 주게 되면, 그 스트링을 이용해서 메시지를 풀게 된다.
만일 crypt_str 인수가 암호화 될 스트링에 나타나지 않는다면, MySQL은 주어진 crypt_str을 리턴한다.
DES_ENCRYPT(str[,{key_num|key_str}])
주어진 키 값을 갖는 스트링을 Triple-DES 알고리즘을 사용해서 암호화 한다.
주어진 키 값을 갖는 스트링을 Triple-DES 알고리즘을 사용해서 암호화 한다.
이 함수는 MySQL이 SSL을 지원하도록 구성되었을 경우에만 동작한다는 점을 알아두자.
Section 5.9.7, “Using Secure Connections”를 참조할 것.
사용할 암호화 키는 두 번째 DES_ENCRYPT()의 두 번째 인수를 기반으로 선택된다:
Argument
Description
No argument
The first key from the DES key file is used.
key_num
The given key number (0-9) from the DES key file is used.
key_str
The given key string is used to encrypt str.
Description
No argument
The first key from the DES key file is used.
key_num
The given key number (0-9) from the DES key file is used.
key_str
The given key string is used to encrypt str.
키 파일은 --des-key-file 서버 옵션을 사용해서 지정할 수가 있다.
리턴 스트링은 첫 번째 문자가 CHAR(128 | key_num)인 곳에 있는 바이너리 스트링이 된다. 만일 에러가 발생한다면, DES_ENCRYPT()은 NULL을 리턴한다.
128은 암호화 키를 보다 쉽게 인식할 수 있도록 추가가 된 것이다. 만일 스트링 키를 사용한다면, key_num 는 127가 된다.
결과 값에 대한 스트링 길이는 아래의 공식에서 주어진다:
new_len = orig_len + (8 - (orig_len % 8)) + 1
DES 키 파일의 각 라인은 아래의 포맷을 가지고 있다:
DES 키 파일의 각 라인은 아래의 포맷을 가지고 있다:
key_num des_key_str
각각의 key_num 값은 0 에서 9 사이의 숫자이어야 한다. 파일의 라인은 순서에 상관이 없다. des_key_str 은 메시지를 암호화하는데 사용된 스트링이다. 숫자와 키 사이에는 최소한 하나 이상의 스페이스가 있어야 한다. 첫 번째 키는 디폴트 키로서, 이것은 만일 여러분이 DES_ENCRYPT()에 대해서 어떠한 키 인수도 지정하지 않았을 경우에 사용된다.
각각의 key_num 값은 0 에서 9 사이의 숫자이어야 한다. 파일의 라인은 순서에 상관이 없다. des_key_str 은 메시지를 암호화하는데 사용된 스트링이다. 숫자와 키 사이에는 최소한 하나 이상의 스페이스가 있어야 한다. 첫 번째 키는 디폴트 키로서, 이것은 만일 여러분이 DES_ENCRYPT()에 대해서 어떠한 키 인수도 지정하지 않았을 경우에 사용된다.
여러분은 FLUSH DES_KEY_FILE 명령문을 사용해서 키 파일로부터 새로운 키 값을 읽어 오도록 MySQL 서버에 지시할 수가 있다. 이렇게 하기 위해서는 RELOAD 권한이 필요하다.
디폴트 키 설정을 보유하는 것의 장점 중의 한가지는, 최종 사용자에게 암호화된 값을 푸는권한을 주지 않고서도 어플리케이션으로 하여금 암호화된 컬럼 값의 존재 유무를 확인할 수 있도록 해 줄 수 있다는 것이다.
mysql> SELECT customer_address FROM customer_table
> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
ENCRYPT(str[,salt])
Unix crypt() 시스템 호출을 사용해서 str 스트링을 암호화 하고 바이너리 스트링을 리턴한다. salt 인수는 최소 두 문자 길이 이상의 스트링이어야 한다. 만일 아무런 salt 인수도 주어지지 않는다면, 랜덤 값이 사용된다.
> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
ENCRYPT(str[,salt])
Unix crypt() 시스템 호출을 사용해서 str 스트링을 암호화 하고 바이너리 스트링을 리턴한다. salt 인수는 최소 두 문자 길이 이상의 스트링이어야 한다. 만일 아무런 salt 인수도 주어지지 않는다면, 랜덤 값이 사용된다.
mysql> SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'
-> 'VxuFAJXVARROc'
ENCRYPT()은 str 의 맨 처음 8개 문자 이외의 모든 것은 무시한다. 이러한 동작은 내부에서 진행되는 crypt() 시스템 호출을 통해 결정된다.
만일 crypt()을 여러분 시스템에서 사용할 수가 없다면 (윈도우 시스템의 경우), ENCRYPT() 는 항상 NULL을 리턴한다.
MD5(str)
스트링에 대해서 MD5 128-bit 체크섬 (checksum)을 계산한다. 그 결과 값은 32 헥사 숫자바이너리 스트링으로 리턴하거나, 또는 인수가 NULL 일 경우에는 NULL로 리턴한다. 예를 들면, 리턴 값은 해쉬 키로 사용될 수 있다.
스트링에 대해서 MD5 128-bit 체크섬 (checksum)을 계산한다. 그 결과 값은 32 헥사 숫자바이너리 스트링으로 리턴하거나, 또는 인수가 NULL 일 경우에는 NULL로 리턴한다. 예를 들면, 리턴 값은 해쉬 키로 사용될 수 있다.
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
-> 'ae2b1fca515949e5d54fb22b8ed95575'
이것은 “RSA Data Security, Inc. MD5 Message-Digest Algorithm”이다.
만일 여러분이 값을 대문자로 바꾸고자 한다면, Section 12.8, “Cast Functions and Operators”에서 BINARY 연산자에 대한 엔트리 부분에 있는 바이너리 스트링 변환 설명을 보기 바란다.
만일 여러분이 값을 대문자로 바꾸고자 한다면, Section 12.8, “Cast Functions and Operators”에서 BINARY 연산자에 대한 엔트리 부분에 있는 바이너리 스트링 변환 설명을 보기 바란다.
MD5 알고리즘에 대한 사항은 이 섹션 도입 부분을 참조하기 바란다.
OLD_PASSWORD(str)
OLD_PASSWORD()는 PASSWORD() 실행이 보다 안전성을 갖도록 추가된 함수다. OLD_PASSWORD()는 4.1 이전 버전의 PASSWORD() 실행 값을 바이너리 스트링 형태로 리턴하며, 이것은 여러분이 사용하는 5.0 서버에 아무런 락킹도 없이 4.1 이전 클라이언트가 접속을 할 수 있도록 해 준다. Section 5.8.9, “Password Hashing as of MySQL 4.1”을 참조할 것.
OLD_PASSWORD()는 PASSWORD() 실행이 보다 안전성을 갖도록 추가된 함수다. OLD_PASSWORD()는 4.1 이전 버전의 PASSWORD() 실행 값을 바이너리 스트링 형태로 리턴하며, 이것은 여러분이 사용하는 5.0 서버에 아무런 락킹도 없이 4.1 이전 클라이언트가 접속을 할 수 있도록 해 준다. Section 5.8.9, “Password Hashing as of MySQL 4.1”을 참조할 것.
PASSWORD(str)
평범한 문장의 패스워드 str 에서 패스워드 스트링을 계산해서 바이너리 스트링으로 리턴하거나, 인수가NULL 일 경우에는 NULL을 리턴한다. 이것은 user 그랜트 테이블의 Password 컬럼에 있는 스토리지용 MySQL 패스워드를 암호화 하는데 사용하는 함수이다.
평범한 문장의 패스워드 str 에서 패스워드 스트링을 계산해서 바이너리 스트링으로 리턴하거나, 인수가NULL 일 경우에는 NULL을 리턴한다. 이것은 user 그랜트 테이블의 Password 컬럼에 있는 스토리지용 MySQL 패스워드를 암호화 하는데 사용하는 함수이다.
mysql> SELECT PASSWORD('badpwd');
-> '*AAB3E285149C0135D51A520E1940DD3263DC008C'
PASSWORD() 암호화는 단 방향이다 (전도 불가능).
PASSWORD()는 유닉스 패스워드가 암호화되는 방식과 동일한 방식으로 패스워드 암호화를 실행하지는 않는다. ENCRYPT()를 참조할 것.
-> '*AAB3E285149C0135D51A520E1940DD3263DC008C'
PASSWORD() 암호화는 단 방향이다 (전도 불가능).
PASSWORD()는 유닉스 패스워드가 암호화되는 방식과 동일한 방식으로 패스워드 암호화를 실행하지는 않는다. ENCRYPT()를 참조할 것.
Note: PASSWORD() 함수는 MySQL 서버에 있는 인증 (authentication) 시스템에 의해 사용된다; 여러분은 자신의 어플리케이션에서 이 함수를 사용하지 말아야 한다. 그런 용도를 위해서는, MD5() 또는 SHA1()를 대신 사용하도록 한다. 여러분의 어플리케이션에서 패스워드와 인증 시스템을 안전하게 다루고자 할 경우에는 RFC 2195 역시 참고를 하기 바란다.
SHA1(str), SHA(str)
RFC 3174 (Secure Hash Algorithm)에서 설명을 하였듯이, 이 함수는 스트링에 대해서 SHA-1 160 비트 체크섬을 계산한다. 결과 값은 40 헥사 숫자로 리턴되거나, 인수가 NULL일 경우에는 NULL 을 리턴한다. 해쉬 키로서 이 함수를 사용할 수가 있다. 또한, 패스워드를 저장하기 위한 암호화 함수로도 이 함수를 사용할 수가 있다. SHA()는 SHA1()과 동일한 것이다.
RFC 3174 (Secure Hash Algorithm)에서 설명을 하였듯이, 이 함수는 스트링에 대해서 SHA-1 160 비트 체크섬을 계산한다. 결과 값은 40 헥사 숫자로 리턴되거나, 인수가 NULL일 경우에는 NULL 을 리턴한다. 해쉬 키로서 이 함수를 사용할 수가 있다. 또한, 패스워드를 저장하기 위한 암호화 함수로도 이 함수를 사용할 수가 있다. SHA()는 SHA1()과 동일한 것이다.
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()는 MD5()와 비교해서 보다 안전한 함수로 인식될 수도 있다. 하지만, 이 섹션 초반부에 있는 MD5 와 SHA-1 알고리즘의 주의 사항에 대해서 먼저 참고를 하기 바란다.
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()는 MD5()와 비교해서 보다 안전한 함수로 인식될 수도 있다. 하지만, 이 섹션 초반부에 있는 MD5 와 SHA-1 알고리즘의 주의 사항에 대해서 먼저 참고를 하기 바란다.
UNCOMPRESS(string_to_uncompress)
COMPRESS() 함수에 의해 압축된 스트링을 푼다. 만일 인수가 압축된 값이 아니라면, 그 결과는 NULL이 된다. 이 함수는 MySQL zlib과 같은 압축 라이브러리로 컴파일 되어 있어야 사용할 수가 있다. 그렇지 않으면, 그 리턴 값은 항상 NULL 이 리턴된다.
COMPRESS() 함수에 의해 압축된 스트링을 푼다. 만일 인수가 압축된 값이 아니라면, 그 결과는 NULL이 된다. 이 함수는 MySQL zlib과 같은 압축 라이브러리로 컴파일 되어 있어야 사용할 수가 있다. 그렇지 않으면, 그 리턴 값은 항상 NULL 이 리턴된다.
mysql> SELECT UNCOMPRESS(COMPRESS('any string'));
-> 'any string'
mysql> SELECT UNCOMPRESS('any string');
-> NULL
UNCOMPRESSED_LENGTH(compressed_string)
압축된 스트링이 압축되기 전의 길이를 리턴한다.
-> 'any string'
mysql> SELECT UNCOMPRESS('any string');
-> NULL
UNCOMPRESSED_LENGTH(compressed_string)
압축된 스트링이 압축되기 전의 길이를 리턴한다.
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30)));
-> 30
[출처] ::: MySQL Korea ::: - http://www.mysqlkorea.co.kr/
MySQL Korea 사이트의 컨텐츠 소유권은 MySQL Korea 에 있으므로
허락 없이 이를 무단전재 하는 경우 저작권법에 민형사적 책임을 지게 되므로
절대 무단 사용을 금해 주시기 바 랍니다
MySQL Korea 저작권 공지 : http://www.mysqlkorea.co.kr/sub.html?mcode=others&scode=04
허락 없이 이를 무단전재 하는 경우 저작권법에 민형사적 책임을 지게 되므로
절대 무단 사용을 금해 주시기 바 랍니다
MySQL Korea 저작권 공지 : http://www.mysqlkorea.co.kr/sub.html?mcode=others&scode=04
댓글목록
등록된 댓글이 없습니다.