Background Image
기타
2008.11.21 19:13

MD5 암호화 모듈

조회 수 38593 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부


자바 저장 함수로 MySQL 암호화 함수 구현하기

소개: 본 문서는 자바 저장 함수를 이용한 암호화 함수 제작 및 사용에 관한 것으로서, 자바 저장 함수의 작성법과 적용 방법, MySQL 암호화 함수의 큐브리드 적용 방법 전달을 목적으로 한다..

JRE : Java Runtime Environment. 자바 실행 환경

JDK : Java development kit. 자바 저장 함수를 컴파일 할 때 사용되는 도구

MD5 : Message-Digest algorithm 5. 널리 사용되고 있는 암호화 해시 함수 표준(RFC 1321)으로 128비트의 값을 가지며 통상 32자리의 문자열로 표현한다.

SHA-1 : Secure Hash Algorithm. 표준으로 사용되는 보안 해시 알고리즘

 

2008-10-20 기술컨설팅팀 손승일, CUBRID

적용 대상: CUBRID2008, JDK1.6.0_04 이상

암호화 자바 저장 함수 작성하기

MD5() 함수

RFC 1321에 규정되어 있는 MD5() 함수를 자바 저장 함수를 이용하여 작성한다.

import java.security.MessageDigest;

import java.security.GeneralSecurityException;

 

public class MD5class {

    public static String MD5(String inpara) {

        byte[] bpara = new byte[inpara.length()];

        byte[] rethash;

        int i;

 

        for (i=0; i < inpara.length(); i++)

            bpara[i] = (byte)(inpara.charAt(i) & 0xff );

 

        try {

            MessageDigest md5er = MessageDigest.getInstance("MD5");

            rethash = md5er.digest(bpara);

        } catch (GeneralSecurityException e) {

            throw new RuntimeException(e);

        }

 

        StringBuffer r = new StringBuffer(32);

        for (i=0; i < rethash.length; i++) {

            String x = Integer.toHexString(rethash[i] & 0xff).toUpperCase();

            if (x.length()<2)

                r.append("0");

            r.append(x);

        }

        return r.toString();

    }

}

자바 내장 함수인 MessageDigest를 사용하여 MD5 알고리즘을 적용하고 생성된 값을 16진수 문자열로 변환하여 32자리 스트링으로 돌려준다. 함수의 입출력은 모두 스트링이다.

PASSWORD() 함수

표준인 보안 해시 알고리즘 SHA1을 사용하여 MySQL PASSWORD 함수를 자바 저장 함수를 이용하여 작성한다.

import java.security.MessageDigest;

import java.security.GeneralSecurityException;

 

public class PASSWORDclass {

    public static String PASSWORD(String inpara) {

        byte[] bpara = new byte[inpara.length()];

        byte[] rethash;

        int i;

 

        for (i=0; i < inpara.length(); i++)

            bpara[i] = (byte)(inpara.charAt(i) & 0xff );

 

        try {

            MessageDigest sha1er = MessageDigest.getInstance("SHA1");

            rethash = sha1er.digest(bpara);     // stage1

            rethash = sha1er.digest(rethash);   // stage2

        } catch (GeneralSecurityException e) {

            throw new RuntimeException(e);

        }

 

        StringBuffer r = new StringBuffer(41);

        r.append("*");

        for (i=0; i < rethash.length; i++) {

            String x = Integer.toHexString(rethash[i] & 0xff).toUpperCase();

            if (x.length()<2)

                r.append("0");

            r.append(x);

        }

        return r.toString();

    }

}

자바 내장 함수인 MessageDigest를 사용하여 입력된 스트링에 SHA1 알고리즘을 적용하고 그 결과에 다시 한번 SHA1 알고리즘을 적용한다. 생성된 값을 16진수 문자열로 변환하여 맨처음에 ‘*’ 문자를 붙여 41자리 스트링으로 돌려준다. 함수의 입출력은 모두 스트링이다.

 OLD_PASSWORD() 함수

MySQLOLD_PASSWORD 함수를 자바 저장 함수를 이용하여 작성한다.

public class OLD_PASSWORDclass {

    public static String OLD_PASSWORD(String inpara) {

        byte[] bpara = new byte[inpara.length()];

        long lvar1 = 1345345333;

        long ladd = 7;

        long lvar2 = 0x12345671;

        int i;

       

        if (inpara.length() <= 0)

          return "";

 

        for (i=0; i < inpara.length(); i++)

          bpara[i] = (byte)(inpara.charAt(i) & 0xff );

 

        for (i=0; i < inpara.length(); i++) {

            if (bpara[i] == ' ' ||

                bpara[i] == 't') continue;

          lvar1 ^= (((lvar1 & 63) + ladd) * bpara[i]) + (lvar1 << 8);

          lvar2 += (lvar2 << 8) ^ lvar1;

          ladd += bpara[i];

        }

 

        lvar1 = lvar1 & 0x7fffffff;

        lvar2 = lvar2 & 0x7fffffff;

 

        StringBuffer r = new StringBuffer(16);

        String x = Long.toHexString(lvar1);

        for (i = 8; i > x.length(); i --)

          r.append("0");

        r.append(x);

       

        x = Long.toHexString(lvar2);

        for (i = 8; i > x.length(); i --)

          r.append("0");

        r.append(x);

        return r.toString();

    }

}

컴파일 및 데이터베이스 등록

컴파일

위에서 작성한 MD5 PASSWORD 함수를 각각 클래스 명과 동일한 MD5class.java, PASSWORDclass.java, OLD_PASSWORDclass.java로 저장하고 다음 그림과 같이 javac 도구를 이용해서 컴파일 한다.

1387062_image1.png

데이터베이스로 로딩하기

컴파일이 오류 없이 종료되면 MD5class.class, PASSWORDclass.class, OLD_PASSWORDclass.class가 생성되는데 이 파일을 loadjava 도구를 사용하여 데이터베이스에 로딩한다. 로딩 과정에서 기존에 작성된 클래스가 있으면 교체할 것인지를 묻는데, 이때 y를 입력하면 된다.

 1387068_image2.png

자바 저장 함수 데이터베이스에 등록하기

클래스 파일의 데이터베이스 로딩이 정상적으로 수행 된 이후 CREATE FUNCTION SQL문을 이용하여 데이터베이스를 함수를 등록하면 함수 사용을 위한 준비가 끝난다.

아래의 그림과 같이 큐브리드 매니저에서 등록할 데이터베이스의 가동 여부를 확인하고 해당 데이터베이스의 질의 편집기를 열어 아래와 같은 SQL를 수행하면 된다.

 

CREATE FUNCTION MD5(inpara STRING) RETURN STRING

AS LANGUAGE JAVA

NAME 'MD5class.MD5(java.lang.String) RETURN java.lang.String';

 

CREATE FUNCTION PASSWORD(inpara STRING) RETURN STRING

AS LANGUAGE JAVA

NAME 'PASSWORDclass.PASSWORD(java.lang.String) RETURN java.lang.String';

 

CREATE FUNCTION OLD_PASSWORD(inpara STRING) RETURN STRING

AS LANGUAGE JAVA

NAME 'OLD_PASSWORDclass.OLD_PASSWORD(java.lang.String) RETURN java.lang.String';


1387070_image3.png

암호화 자바 저장 함수의 사용

자바 저장 함수의 사용

큐브리드 자바 저장 함수는 아래와 같이 CALL문에 의해 사용되거나, SQL문에 큐브리드 내장 함수처럼 사용될 수 있다.

call md5('qwer1234');

 

select md5('qwer1234') from db_root;

 

call password('qwer1234');

 

select password('qwer1234') from db_root;

 

call old_password(‘qwer1234’) from db_root;

 

select old_password(‘qwer1234’) from db_root;

MySQL 암호화 함수와의 비교

위에서 작성한 자바 저장 함수는 MySQL MD5(), PASSWORD(), OLD_PASSWORD() 함수와 동일한 결과를 돌려주는 것으로 MySQL에서 큐브리드로 데이터베이스를 마이그레이션 했더라도 큐브리드가 MySQL과 동일한 암호화 함수를 지원하지 않는 까닭에 회원 정보에서 사용자 암호 필드를 재설정해야 하는 어려움이 있었는데, 작성된 암호화 자바 저장 함수를 사용한다면 MySQL과 동일한 값을 돌려주는 함수를 적용해서 암호 재설정의 어려움 없이 간편한 데이터베이스 마이그레이션이 가능해진다. 다음은 임의의 스트링을 큐브리드와 MySQL에서 수행하여 동일한 결과를 얻는지 시험한 것이다.

select md5('qwer1234') from db_root;

select password('qwer1234') from db_root;

select old_password('qwer1234') from db_root;

select md5('123456789abceefgh987654321') from db_root;

select password('123456789abceefgh987654321') from db_root;

select old_password('123456789abceefgh987654321') from db_root;

select md5('zwyxqweras245677334520000mmmmmmmmm') from db_root;

select password('zwyxqweras245677334520000mmmmmmmmm') from db_root;

select old_password('zwyxqweras245677334520000mmmmmmmmm') from db_root;

 

md5('qwer1234')

======================

  '5d93ceb70e2bf5daa84ec3d0cd2c731a'

 

  password('qwer1234')

======================

  '*D75CC763C5551A420D28A227AC294FADE26A2FF2'

 

old_password('qwer1234')

======================

  '07a4ac6f6040e4c4'

 

  md5('123456789abceefgh987654321')

======================

  '32242ccfd16308ffd437d154ffea78a0'

 

  password('123456789abceefgh987654321')

======================

  '*FEC51C4E121FE5D5B560C838405FC0964A756379'

 

old_password('123456789abceefgh987654321')

======================

  '45b415651733131e'

 

  md5('zwyxqweras245677334520000mmmmmmmmm')

======================

  'b4e0911b7bc3cf302d8927b2f5aadad8'

 

  password('zwyxqweras245677334520000mmmmmmmmm')

======================

'*AFE8B5B11A527AEDB4C8CFB5324517045D969716'

old_password('zwyxqweras245677334520000mmmmmmmmm')

======================

'2119d0f84ab7053f'

큐브리드에서 암호화 함수를 수행한 결과

 

select md5('qwer1234');

select password('qwer1234');

select old_password('qwer1234');

select md5('123456789abceefgh987654321');

select password('123456789abceefgh987654321');

select old_password('123456789abceefgh987654321');

select md5('zwyxqweras245677334520000mmmmmmmmm');

select password('zwyxqweras245677334520000mmmmmmmmm');

select old_password('zwyxqweras245677334520000mmmmmmmmm');

+----------------------------------+

| md5('qwer1234')                  |

+----------------------------------+

| 5d93ceb70e2bf5daa84ec3d0cd2c731a |

+----------------------------------+

 

+-------------------------------------------+

| password('qwer1234')                      |

+-------------------------------------------+

| *D75CC763C5551A420D28A227AC294FADE26A2FF2 |

+-------------------------------------------+

 

+-------------------------------------------+

| old_password('qwer1234')                       |

+-------------------------------------------+

| 07a4ac6f6040e4c4                                                                  |

+-------------------------------------------+

 

+-----------------------------------+

| md5('123456789abceefgh987654321') |

+-----------------------------------+

| 32242ccfd16308ffd437d154ffea78a0  |

+-----------------------------------+

 

+-------------------------------------------+

| password('123456789abceefgh987654321')    |

+-------------------------------------------+

| *FEC51C4E121FE5D5B560C838405FC0964A756379 |

+-------------------------------------------+

 

+-------------------------------------------+

| old_password('123456789abceefgh987654321')    |

+-------------------------------------------+

| 45b415651733131e                                                                |

+-------------------------------------------+

 

+-------------------------------------------+

| md5('zwyxqweras245677334520000mmmmmmmmm') |

+-------------------------------------------+

| b4e0911b7bc3cf302d8927b2f5aadad8          |

+-------------------------------------------+

 

+------------------------------------------------+

| password('zwyxqweras245677334520000mmmmmmmmm') |

+------------------------------------------------+

| *AFE8B5B11A527AEDB4C8CFB5324517045D969716      |

+------------------------------------------------+

 

+------------------------------------------------+

| old_password('zwyxqweras245677334520000mmmmmmmmm') |

+------------------------------------------------+

| 2119d0f84ab7053f                                                                       |

+------------------------------------------------+

MySQL에서 암호화 함수를 수행한 결과

응용에 적용하기

아래의 소스는 회원 로그인을 검사하는 PHP 소스로 위에서 작성된 자바 저장 함수를 사용하게 되면 SQL문은 변경없이 그대로 사용될 수 있음을 확인할 수 있다.

// 회원 로그인 체크

              $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());

              $member_data = mysql_fetch_array($result);

MySQL-PHP의 회원 로그인 소스

 

// 회원 로그인 체크

              $pass                 = $DB -> GetPassword( $password ) ;

              $rs = $DB -> Execute("select * from $member_table where user_id='$user_id' and password=password('$pass')") or error( $DB -> ErrorMsg(),"");

CUBRID-PHP의 회원 로그인 소스

제한 사항

·      위에서 작성된 PASSWORD 함수는 MySQL 4.1.1이후 버전에 적용되고 이전 버전에 대해서는 OLD_PASSWORD 함수를 적용하여야 한다.

·      큐브리드에서는 데이터베이스 단위로 정보를 관리하므로 작성한 MD5(), PASSWORD(), OLD_PASSWORD()를 다른 데이터베이스에서도 사용하려면 각 데이터베이스에 별도로 로딩 및 등록해 주어야 한다.

·      MD5(), PASSWORD(), OLD_PASSWORD() 함수는 입력된 문자열의 길이에 관계없이 고정 길이의 해시 값을(Message Digest) 돌려주는 기능을 수행하는 것으로 동일한 비밀번호를 입력했는가를 검사할 수 있지만 원문을 복호화 할 수 없으므로 주의한다.



List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
46 튜닝 [질의튜닝]order by desc가 인덱스 타게 하려면 admin 2011.07.14 28473
45 튜닝 CUBRID 2008 R4.0의 커버링 인덱스(covering index)는 무엇인가? file admin 2011.07.14 29882
44 튜닝 SNS 유형 서비스에서 CUBRID와 MySQL 조회 성능 비교 file admin 2011.07.14 21188
43 기타 CUBRID 볼륨 공간 재사용률 비교 - 2008 R3.1 vs. 2008 R4.0 file admin 2011.07.14 16555
42 기타 CUBRID 2008 R4.0 파라미터 변경 사항 (일부) file admin 2011.07.14 13154
41 기타 CUBRID 2008 R4.0 GA 버전의 주요 기능만 요약한 PPT 문서 file admin 2011.07.14 15460
40 기타 동시 접속자에 따른 파라미터 설정 admin 2011.07.14 25684
39 기타 CUBRID 매니저 R3.1에서 웹호스팅 서버의 CUBRID R2.1 접속하는 방법 (큐브리드 매니저에서 다른 버전의 큐브리드 서버 접속 방법) file admin 2011.07.14 31507
38 기타 [주의사항] CUBRID에서의 BLOB/CLOB 사용시 백업 및 복구에 대한 주의 점 admin 2011.07.14 52775
37 기타 자주 발생하는 큐브리드(cubrid) 에러 메시지 정리 admin 2011.07.14 81420
36 Install CUBRID Ubuntu Launchpad Installation 방법 file 정만영 2011.07.19 29604
35 Install LINUX CUBRID 4.0 매니저 설치방법 file 정만영 2011.07.19 23654
34 기타 select .. for update 처리를 위한 Stored Procudure 등록 및 사용법 남재우 2011.12.10 24871
33 Install CUBRID기반으로 XE 운영하기 – 설치가이드 file cubebridge 2012.04.13 30932
32 Java CUBRID와 Oracle의 Clob 타입 사용 방법 비교. seongjoon 2012.06.30 54557
31 ODBC/OLEDB VB에서 CUBRID ODBC/OLEDB 사용하는 방법 및 샘플코드. file seongjoon 2012.06.30 26926
30 기타 HA 환경 구성 시 데이터 복제 지연이 발생하는 경우 ECHO(7) port를 확인하자. 손승일 2012.11.29 26440
29 PHP Apache, PHP 설치 방법 file 이용미 2013.05.16 41246
28 PHP phpize를 이용한 PHP 모듈 연동 방법(CUBRID2008 R4.3 버전) file 이용미 2013.05.16 20857
27 Linux CUBRID Linux 부팅시 자동시작 서비스 설정 방법 정만영 2013.09.16 25470
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales