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
번호 분류 제목 글쓴이 날짜 조회 수
166 기타 CUBRID 2008 주요 명령어 admin 2008.11.21 30805
165 Install CUBRID 2008 을 하나의 머신에 여러번 설치하기(multi instance) admin 2008.11.21 31459
164 Windows CUBRID 2008 사용법 admin 2008.11.21 47933
163 Linux CUBRID 2008 사용법 admin 2008.11.21 36761
162 기타 UTF-8 사용법 admin 2008.11.21 23235
161 기타 대량의 데이터 입력 방법 admin 2008.11.21 32655
160 Linux 복제 따라하기 admin 2008.11.21 29094
159 기타 시스템 카다로그 2 admin 2008.11.21 22333
158 기타 CUBRID와 타 데이터베이스 기능 비교 9 admin 2008.11.21 36163
157 기타 보안 설정 admin 2008.11.21 22838
156 기타 csql(SQL 실행기) 사용법 1 admin 2008.11.21 26556
155 Java DBCP 사용법 1 admin 2008.11.21 48362
154 CCI/DB API embedded sql 사용법 admin 2008.11.21 29731
» 기타 MD5 암호화 모듈 file admin 2008.11.21 38593
152 기타 제로보드 XE 사용하기 file admin 2008.11.21 33068
151 PHP windows 상에서 PHP 설치하기 file admin 2008.11.21 51804
150 PHP LINUX에서 PHP 사용하기 - phpize를 이용한 설치 1 admin 2008.11.21 37461
149 PHP LINUX에서 PHP 사용하기 file admin 2008.11.21 42495
148 Install CUBRID6.6 이상에서 CUBRID2008 로 데이터베이스 이전 하기 3 남재우 2008.11.21 26444
147 Install UNIX/LINUX 에서 CUBRID 설치하기 남재우 2008.11.22 37518
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