Knowledge Map

mysql 암호화 본문

DataBase

mysql 암호화

2016. 5. 13. 16:30

애를 먹었던 게 있었는데 해결이 되었다. 뭐였냐면 로그인..


저번에는 되었는데 이번에 안된다고 했다. 그래서 한번 죽 찾아보았다.

mysql에서 password('패스워드') 이런 방식으로 되어있었다. 


이런 방식을 사실은 처음 봐서 프로시저라도 짜놓은건가 했었는데 그게 아니라 mysql에서 지원하는 기능이라고 한다.;;

여튼 문제는 뭐였냐면 DB에서의 password  컬럼이 varchar(16)이었다는 점이다;;;


암호화를 했을때 32자리는 충분히 넘어가는데 16자리만 지원하도록 되어있었으니 안 먹힐수 밖에 없었던 것이다.

이걸 파악 못해서 참 한참 헤멧다. 찾은게 어디야 라고 위안을 삼고 있다.


여튼 mysql 의 암호화에 대해서 간단히 기록한다.




출처 : 

http://sopie2000.tistory.com/10       

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21837&cat1=12&cat2=359&cat3=373&lang=k       :http://blog.habonyphp.com/entry/mysql-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94%ED%95%98%EB%8A%94-AES-%ED%95%A8%EC%88%98#.VzV88eSi9lY       :

http://redkite777.tistory.com/entry/MySQLMySQL-%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94


데이터 암호화 방법

 

  단방향 암호화

 - MD5, SHA1 같은 방법으로 암호화(Encrypt)후 원래대로 복호화(Decrypt)가 필요없는 경우
 - EX) 패스워드, 주민번호(복호화 불필요시) 등

 쌍방향 암호화

 - DES, DES3, ENC, COMPRESS 같은 방법으로 암호화(Encrypt)후   

   원래대로 복호화(Decrypt)가 필요한 경우
 - EX) 이름, 아이디, 주민번호 (나이계산, 생일), 메일주소, 주소,닉네임, 나이,생일 등

 

 

- 암호화를 하면 데이터의 길이가 늘어나므로 데이터의 Length를 늘려주어야 한다.  

- 실제 데이터의 Length가  암호화된 데이터에 길이보다 짧다면 짤려서 삽입된다.



MYSQL에서 지원하는 암호화 함수

 

 

 

단방향 암호화만 지원

 

- MD5, PASSWORD. SHA1, SHA

쌍방향 암호화 (암호화,복호화) 지원

 

- AES_ENCRYPT ,AES_DECRYPT

- DES_ENCRYPT ,DES_DECRYPT

- DECODE, ENCODE

- COMPRESS, UNCOMPRESS





AES함수


mysql 에는 데이터를 암호화, 복호화하는 AES_ENCRYPT, AES_DECRYPT 함수가 있습니다. 이 암호화는 128비트 길이로 인코딩되어 저장됩니다. 그러나 소스를 수정해서 256비트까지 확장시킬수 있다고 합니다.

AES_ENCRYPT 는 문자열을 암호화하고, 바이너리 문자열을 반환하지만, AES_DECRYPT 는 암호화된 문자열을 복호화합니다. AES_DECRYPT 는 유효하지 않은 데이터는 padding을 감지하고, NULL을 반환합니다.

 # "암호화 키"는 임의의 값이 올 수 있으며, "문자열"은 암호화하고자 하는 값이 됩니다.

 # AES_ENCRYPT 암호화
  INSERT INTO 테이블명 VALUES (HEX(AES_ENCRYPT('문자열', '암호화 키')));
 
 # AES_DECRYPT 복호화
  SELECT AES_DECRYPT(UNHEX(필드명), '암호화 키') FROM 테이블명;

예제 (ex #1
 # AES_ENCRYPT 암호화
 INSERT INTO tbname VALUE (HEX(AES_ENCRYPT('123456','가나다라')));
 // 결과: 5A33E11DC0B638E4E5E74EBD52F55E3D

 # AES_DECRYPT 복호화
 SELECT AES_DECRYPT(UNHEX(필드명), '가나다라') FROM tbname;




단방향 암호화함수


mysql 에 단방향 암호화함수가 있는데, md5, sha1 함수가 그 것입니다. 이 함수는 php 함수와 동일한 기능으로 작동하는데, md5 는 128비트 체크섬을 계산하여 32헥사 자리 바이너리 문자열을 반환하고, sha1 함수는 RFC 3174로 묘사된 문자에 대한 160 비트 체크섬을 계산하여 40 헥사 자리 바이너리 문자열을 반환합니다.


 SELECT MD5(str);
 SELECT SHA1(str);

예제(ex #1
 mysql> SELECT MD5('test');
      -> 098f6bcd4621d373cade4e832627b4f6

 mysql> SELECT SHA1('test');
      -> a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

 // SHA 함수는 SHA1 함수의 동의어입니다.
 mysql> SELECT SHA('test');
      -> a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

예제(ex #2
 mysql> SELECT SHA1(MD5('test'));
      -> 4028a0e356acc947fcd2bfbf00cef11e128d484a



PASSWORD()함수


이 함수는 일반 문자열을 str 를 암호화한 바이너리 문자열을 반환합니다. str 이 NULL 이면 NULL 를 반환합니다.

 SELECT PASSWORD(str);


예제(ex #1

 mysql> SELECT PASSWORD('test');
      -> *47A6B0EA08A36FAEBE4305B373FE37E3CF27C357






MySQL 암호화

MySQL을 이용하는 대부분의 사이트에서 사용자의 정보를 암호화 하는데 MD5(SHA1)를 사용합니다. 하지만 MD5(SHA1)는 암호화가 아닌 해시 값 입니다. 해시 알고리즘 MD5(SHA1)에 의한 문자열입니다. 사용자 개인정보를 취급하는데 있어 DB전체 데이터를 분실한다고 했을때 많은 손실을 받을 수 있습니다. 물론 한개의 비밀번호를 알아내는데 약간의 시간이 필요하지만 그렇다고 해서 못알아내는 것은 아닙니다.

완벽한 보안이 아닌 그나마 차선책으로라도 암호화를 해 저장을 한다면 이러한 방식은 어떻까 합니다. MySQL 내부의 암호화 방식인 AES/DES를 사용해보는것입니다. AES(Advenced Encryption Standard) 는 미국 정부 표준으로 지정이된 블록암호화 알고리즘입니다 PHP 에서도 libmcrypt (mcrypt) 로 지원을 합니다. MySQL 에서는 128bit를 기본적으로 지원을 하고 있습니다.

이제 MySQL 에서 AES(Rijndael)를 사용하는 방법을 알아보겠습니다. 암호화는 암호화/복호화를 하기때문에 키관리가 중요합니다. 저의 생각으로는 암호화에서 키를 사용자에게 맏기는 방법은 어떠한가 생각을 해봅니다. 지금도 그렇지만 예전에도 키 관리는 사용자의 암호를 이용해 키를 관리하는 방식이 좋다고 생각합니다.

일단 예제를 보겠습니다.
[MD5 예]

-- 사용자 테이블
CREATE TABLE User
(
seq INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
userId CHAR(20) NOT NULL,
passWd CHAR(32) NOT NULL,
PRIMARY KEY(`seq`),
UNIQUE INDEX (`userId`)
)
ENGINE=MyISAM;
-- 사용자 정보 입력

mysql> INSERT INTO User (userId, passWd) VALUES ('lovelgw', MD5('123456'));
Query OK, 1 row affected (0.00 sec)
-- 사용자 로그인

mysql> SELECT * FROM User WHERE userId = 'lovelgw' AND passWd = MD5('123456');
+-----+---------+----------------------------------+
| seq | userId | passWd |
+-----+---------+----------------------------------+
| 1 | lovelgw | e10adc3949ba59abbe56e057f20f883e |
+-----+---------+----------------------------------+
1 row in set (0.00 sec)

이렇게 관리를 하겠죠, 보안상 취약점을 모르시겠다고요? 음. 그렇지 않습니다. DB파일 전체가 노출되거나 또는 내부 직원의 실수등으로 DB전체가 노출이 된상태라면 사용자의 개인정보는 공개 정보가 되는것입니다. 암호화 방식 을 AES로 변경해보겠습니다. 키를 내부적으로 관리하지 않는다는 가정하에 아래와 같이 작성 할 수 있습니다.

[AES 예]

-- 사용자 테이블
CREATE TABLE User
(
seq INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
userId CHAR(20) NOT NULL,
-- HEX함수를 사용하지 않으려면 필드 타입을 BINARY 로 해주시면 됩니다.
passWd CHAR(40) NOT NULL,
PRIMARY KEY(`seq`),
UNIQUE INDEX (`userId`)
)
ENGINE=MyISAM;
-- 사용자 정보 입력

mysql> INSERT INTO User (userId, passWd) VALUES ('lovelgw', HEX(AES_ENCRYPT('123456', MD5('123456'))));
Query OK, 1 row affected (0.00 sec)
mysql> select * from User;
+-----+---------+----------------------------------+
| seq | userId | passWd |
+-----+---------+----------------------------------+
| 1 | lovelgw | 59B6FF82CD62F195F55DD3A4BB2E1D70 |
+-----+---------+----------------------------------+
1 row in set (0.00 sec)
-- 사용자 로그인 (사용자 정보조회)

mysql> SELECT * FROM User WHERE userId = 'lovelgw' AND AES_DECRYPT(UNHEX(passWd), MD5('123456'));
+-----+---------+----------------------------------+
| seq | userId | passWd |
+-----+---------+----------------------------------+
| 1 | lovelgw | 59B6FF82CD62F195F55DD3A4BB2E1D70 |
+-----+---------+----------------------------------+
1 row in set (0.00 sec)

위와 같이 AES예를 보았습니다. 사용자의 암호가 암호화 방식의 키가 되겠습니다. 평문길이가 약 20Byte정도 일때 암호화 문자열의 길이는 약 32Byte정도 입니다. (암호화 키는 사용자 암호의 MD5이용, AES_ENCRYPT 결과는 HEX함수를 이용했을 경우) 필드 데이터 타입을 바이너리로 정의를 하면 HEX를 사용하지 않아도 됩니다. 하지만 기존 테이블 규칙을 사용한다는 가정하에 위와 같이 적용해보았습니다.

사용자 정보의 암호화를 이용해서 보안에서의 최소안의 피해 및 누출을 막음으로서 더욱 안전하게 관리를 할 수 있습니다.구지 사용자의 암호를 관리적 측면에서 알 필요가 없으니 사용자가 입력한 암호로 사용자의 데이터를 암호화 하는데 사용합니다. 관리적측면에서의 보안적인 편리함이 더욱더 늘어 난것이죠

이제 MD5가 얼마나 위험하고 손쉽게 추적이 가능한지 알아보도록 하겠습니다.

원문 : lovelgw
MD5해시 : 84cefd52366042c03c1bf9e47b1409a1
nVidia GeForce 8500 GT 으로 2분 34초 만에 값을 알아내었습니다.
MD4/MD5/SHA1 GPU Password Recovery v0.62 (http://www.golubev.com/)

X:\>ighashgpu.exe -h:84cefd52366042c03c1bf9e47b1409a1 -t:md5 -hm:0 -max:7
****************************************************************
*** MD4/MD5/SHA1 GPU Password Recovery v0.62 ***
*** For ATI RV 7X0 cards and nVidia 'CUDA' ones (G80+) ***
*** (c) 2009 Ivan Golubev,
http://golubev.com ***
*** see "readme.htm" for more details ***
****************************************************************
*** Any commercial use of this program is strictly forbidden ***
****************************************************************

Found 1 CUDA device(s)
Starting brute-force attack, Charset Len = 26, Min passlen = 4, Max passlen = 7
Charset (unicode -> 0) [abcdefghijklmnopqrstuvwxyz]
Charset in HEX: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a
Starting from [aaaa]
Hash type: MD5, Hash: 84cefd52366042c03c1bf9e47b1409a1
Device #0: [GeForce 8500 GT] 918.00 Mhz 16 SP
Hardware monitoring disabled.
CURPWD: ghlzlhm DONE: 43.52% ETA: 2m 34s AVRSPD: 29.4M
Found password: [lovelgw], HEX: 6c 6f 76 65 6c 67 77
Processed 3 816 816 640 passwords in 2m 11s.
Thus, 29 339 139 password(s) per second in average.

위 처럼 손쉽게 MD5 해시 값을 쉽게 찾아 낼 수 있습니다. GPU를 이용하는 프로그램이라 더욱 좋은 그래픽 카드가 있다면 더욱 빨리 값을 찾아내겠죠. 만약 DB전체가 노출된 경우라면 비밀번호는 쉽게 알아낼 수 있습니다.

하 지만 위 방식(AES)으로 암호화를 한다면 개인의 데이터의 암호화 한 키가 전부 다르면 데이터가 노출이 된 후 복호화를 시도한다고 하면 매우 오랜 시간이 걸립니다. 약간(?)의 보안성이 더해진것이죠~ DB전체가 노출되더라도 중요한 데이터는 막혀 있는 샘이죠~ 위 방식으로 다양한 활용 및 보안에 더욱더 완벽해 질 수 있는 방법을 찾을 수 있습니다. ^^ 













암호화 함수와 압축함수는 바이너리 스트링을 결과 값 (arbitary bytes value) 으로 출력한다.

그래서 저장할때에는 char 또는 Varchar 보다는 BLOB컬럼을 사용하는것이 트레일링 스페이스 제거와 같은 문제를 발생시키지 않는다고 한다.


AES_ENCRYPT(str,key_str), AES_DECRYPT(crypt_str,key_str) 


AES 알고리즘을 사용해서 암호화 및 복호화를 한다. 128비트 길이의 암호화를 한다.

AES_ENCRYPT() 은 String을 암호화해서 binary string 값으로 반환한다. 

AES_DESCRIPT() 은 암호화된 것을 다시 복호화해서 String 값으로 반환한다. 


입력한 값의 길이와 상관없으며 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

























'DataBase' 카테고리의 다른 글

개별 항목 갯수, 중복 제거 쿼리  (0) 2016.05.18
old password 셋팅, innoDB 에러  (0) 2016.05.18
이중 쿼리, subQuery  (0) 2016.05.17
MySQL 기본 명령어 정리  (0) 2016.04.24
MYSQL Workbench에서 덤프하기  (0) 2016.02.16
Comments