반응형

1. 데이터 암호화 방식
   1) 단방향 암호화
       MD5, SHA1 같은 방법으로 암호화(Encrypt) 후 원래대로 복호화(Decrypt)가 필요 없는 경우
       예) 패스워드, 주민번호(복호화 불필요시)등
   2) 쌍방향 암호화
       DES, DES3, ENC, COMPRESS 같은 방법으로 암호화(Encrypt) 후 원래대로 복호화(Decrypt)가 필요한 경우
       예) 이름, 아이디, 주민번호(나이계산, 생일), 메일주소, 주소, 닉네임, 나이, 생일

 

2. MySQL에서 지원하는 암호화 함수
   1) 쌍방향 암호화 (암호화, 복호화) 지원
       ▶ AES_ENCRYPT, AES_DECRYPT

 drop table member_info;
 create table member_info
 (user_id varbinary(16) primary key, 
 passwd varbinary(100),
 age    int,
 sex    int
 );

 insert into member_info values('themade', hex(aes_encrypt('themade','aaaa')), 32, 1)
                             ,('swpark', hex(aes_encrypt('swpark','aaaa')), 24, 1);

 select * from member_info;

 select AES_DECRYPT(UNHEX(passwd), 'aaaa') as passwd 
 from member_info;

 

       ▶ DES_ENCRYPT, DES_DECRYPT (해당 암호화는 mysql 설정 시, --with-ssl을 추가해 줘야 실행할 수 있다.)

 drop table member_info2;
 create table member_info2
 (user_id varbinary(16) primary key, 
 passwd varbinary(100),
 age    int,
 sex    int
 );

 insert into member_info2 values('themade', DES_ENCRYPT('themade','aaaa'), 32, 1)
                                            ,('swpark', DES_ENCRYPT('swpark','aaaa'), 24, 1);

 select * from member_info2;

 select DES_DECRYPT(passwd, 'aaaa') as passwd from member_info2;

 

       ▶ DECODE, ENCODE

 drop table member_info3;
 create table member_info3
 (user_id varbinary(16) primary key, 
 passwd varbinary(100),
 age    int,
 sex    int
 );

 insert into member_info3 values('themade', ENCODE('themade','aaaa'), 32, 1)
                              ,('swpark', ENCODE('swpark','aaaa'), 24, 1);
                              
 select * from member_info3;

 select DECODE(passwd, 'aaaa') as passwd from member_info3;

 

       ▶ COMPRESS, UNCOMPRESS

 

   2) 단방향 암호화 지원

       ▶ MD5, SHA

 drop table member_info;
 create table member_info
 (user_id varbinary(16) primary key, 
 passwd varbinary(100),
 age    int,
 sex    int
 );

 insert into member_info values('themade', md5('themade'), 32, 1)
                             ,('swpark', sha('swpark'), 24, 1);

 select * from member_info;

 

       ▶ password, old_password

           MySQL 내의 함수로 password함수는 5.1부터 나온 함수이고, 5.1에서는 이전 password 함수를 old_password라고 한다.

           4.0에서 사용하던 password함수가 5.1까지는 old_password로 변경이 되었는데 5.5부터는 old_password조차 지원하지

           않는다. 해당 mysql 테이블 권한을 주었다면 상관없지만 해당 함수로 서비스에서 사용하는 패스워드로 적용하지 않는 것이

           좋다.

 drop table member_info;
 create table member_info
 (user_id varbinary(16) primary key, 
 passwd varbinary(100),
 age    int,
 sex    int
 );

 insert into member_info values('themade', password('themade'), 32, 1)
                             ,('swpark', password('swpark'), 24, 1);

 select * from member_info;

 

3. 암호화 과정에서의 주의사항

    ▶ MySQL 테이블 암호화는 암호화하는 과정에서 CPU도 많은 부분 사용하기 때문에 기존에 있는 컬럼을 암호화시 서버에 부하가

        되는지 먼저 테스트해보아야 한다.

    ▶ 암호화의 데이터 길이를 고려하여 컬럼 길이와 타입을 변경해야 한다.

        잘못하면 암호화 시킨 데이터가 입력이 안되는 경우가 발생할 수도 있다.

    ▶ TEST 서버에서 충분한 테스트를 진행해야 한다.

 

4. 문제 발생시 빠른 테이블 전환

 // 데이터 백업
 create table member_info_old_20131111
 select * from member_info;

 // 테이블명 변경
 drop table member_info;
 alter table member_info_old_20131111 rename to member_info;

 


반응형

+ Recent posts