웹프로그래밍

Global It Leader!!


MySql


 
 

암호화 함수와 압축 함수

페이지 정보

작성자 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 4,383회 작성일 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비트를 사용하는데, 이 크기가 성능면에서 가장 훌륭하고 또한 충분히 안전성을 보장하기 때문이다.
 
AES_ENCRYPT()는 스트링을 암호화해서 바이너리 스트링으로 값을 리턴한다. AES_DESCRIPT()는 암호화된 스트링을 복호화한 다음에 원래의 스트링으로 리턴한다. 입력 인수의 길이는 크기가 상관이 없다. 만일 입력 인수가 NULL 이라면,  이 함수의 결과 값 역시 NULL 이 된다.
 
AES는 블록 레벨의 알고리즘이기 때문에, 일정하지 않은 크기의 스트링을 암호화 하기 위해서 패딩 (padding)을 사용하며, 따라서 그 결과 값 스트링은 아래의 공식을 사용해서 계산된다:
16 × (trunc(string_length / 16) + 1)
만일 AES_DECRYPT()가 옳지 않은 데이터 또는 틀린 패딩을 발견하면, NULL을 리턴한다. 하지만, 입력 데이터 또는 키가 올바르지 않을 경우라도 AES_DECRYPT()은 NULL 값이 아닌 값을 리턴할 가능성도 있다 (possibly garbage).
 
여러분은 아래와 같이 쿼리를 수정해서 암호화된 형태로 데이터를 저장하기 위해 AES 함수를 사용할 수가 있다:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT() 와 AES_DECRYPT() 함수는 MySQL이 현재 사용하고 있는 암호화 함수 중에 가장 안전한 것으로 생각을 해도 무방하다.
COMPRESS(string_to_compress)
스트링을 압축해서 그 결과를 바이너리 스트링으로 나타낸다. 이 함수는 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()에서 리턴된 스트링이어야 한다.
ENCODE(str,pass_str)
pass_str 를 패스워드로 사용해서 str를 암호화한다. 암호화된 결과 값을 풀기 위해서는, DECODE()를 사용한다.
그 결과 값은 str의 바이너리 스트링과 같은 길이가 된다.
DES_DECRYPT(crypt_str[,key_str])
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 알고리즘을 사용해서 암호화 한다.
이 함수는 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.
 
 
키 파일은 --des-key-file 서버 옵션을 사용해서 지정할 수가 있다.
 
리턴 스트링은 첫 번째 문자가 CHAR(128 | key_num)인 곳에 있는 바이너리 스트링이 된다. 만일 에러가 발생한다면, DES_ENCRYPT()은 NULL을 리턴한다.
 
128은 암호화 키를 보다 쉽게 인식할 수 있도록 추가가 된 것이다. 만일 스트링 키를 사용한다면, key_num 는 127가 된다.
 
결과 값에 대한 스트링 길이는 아래의 공식에서 주어진다:
new_len = orig_len + (8 - (orig_len % 8)) + 1
DES 키 파일의 각 라인은 아래의 포맷을 가지고 있다:
key_num des_key_str
각각의 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 인수도 주어지지 않는다면, 랜덤 값이 사용된다.
mysql> SELECT ENCRYPT('hello');
        -> 'VxuFAJXVARROc'
 
ENCRYPT()은 str 의 맨 처음 8개 문자 이외의 모든 것은 무시한다. 이러한 동작은 내부에서 진행되는 crypt() 시스템 호출을 통해 결정된다.
만일 crypt()을 여러분 시스템에서 사용할 수가 없다면 (윈도우 시스템의 경우), ENCRYPT() 는 항상 NULL을 리턴한다.
MD5(str)
스트링에 대해서 MD5 128-bit 체크섬 (checksum)을 계산한다. 그 결과 값은 32 헥사 숫자바이너리 스트링으로 리턴하거나, 또는 인수가 NULL 일 경우에는 NULL로 리턴한다. 예를 들면, 리턴 값은 해쉬 키로 사용될 수 있다.
mysql> SELECT MD5('testing');
        -> 'ae2b1fca515949e5d54fb22b8ed95575'
이것은 “RSA Data Security, Inc. MD5 Message-Digest Algorithm”이다.
만일 여러분이 값을 대문자로 바꾸고자 한다면, 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”을 참조할 것.
PASSWORD(str)
평범한 문장의 패스워드 str 에서 패스워드 스트링을 계산해서 바이너리 스트링으로 리턴하거나, 인수가NULL 일 경우에는 NULL을 리턴한다. 이것은 user 그랜트 테이블의 Password 컬럼에 있는 스토리지용 MySQL 패스워드를 암호화 하는데 사용하는 함수이다.
mysql> SELECT PASSWORD('badpwd');
        -> '*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()과 동일한 것이다.
mysql> SELECT SHA1('abc');
        -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
 
SHA1()는 MD5()와 비교해서 보다 안전한 함수로 인식될 수도 있다. 하지만, 이 섹션 초반부에 있는 MD5 와 SHA-1 알고리즘의 주의 사항에 대해서 먼저 참고를 하기 바란다.
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

[출처] ::: MySQL Korea ::: - http://www.mysqlkorea.co.kr/
MySQL Korea 사이트의 컨텐츠 소유권은 MySQL Korea 에 있으므로
허락 없이 이를 무단전재 하는 경우 저작권법에 민형사적 책임을 지게 되므로
절대 무단 사용을 금해 주시기 바 랍니다
MySQL Korea 저작권 공지 : http://www.mysqlkorea.co.kr/sub.html?mcode=others&scode=04

댓글목록

등록된 댓글이 없습니다.

전체 56
게시물 검색
MySql 목록
번호 제목 글쓴이 조회 날짜
36 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4116 12-18
35 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3939 12-18
34 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3702 12-18
33 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3682 11-10
32 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3843 07-29
31 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4000 06-20
열람중 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4384 03-28
29 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4348 08-17
28 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4654 08-16
27 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4339 08-16
26 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 9854 05-07
25 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4029 08-10
24 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 5095 08-03
23 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4113 08-03
22 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4749 07-30
21 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 3994 07-27
20 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4041 03-10
19 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4430 03-05
18 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4094 03-05
17 no_profile 오원장 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 4077 03-04