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
번호 분류 제목 글쓴이 날짜 조회 수
26 Java CUBRID와 MyBATIS 빠르게 연동하기 file 김승훈 2015.05.07 19123
25 Windows Windows 에 설치 된 JRE 설치 위치 확인 하기. file 성진 2015.05.28 12566
24 기타 CUBRID isolation level & Dirty Read 정만영 2015.05.29 11310
23 PHP CUBRID HA 환경에서 Apache-PHP 설정 가이드 이용미 2015.06.16 10661
22 기타 콘솔에서 마이그레이션 하기. file 권호일 2015.06.19 13427
21 기타 CUBRID Migration방법(by unloaddb & loaddb) 주현 2015.07.01 21830
20 Linux 가상머신 환경에서 리눅스 및 큐브리드 설치 가이드 file 이경오 2015.07.14 13367
19 기타 알고 보면 쉬운 cubrid lockdb 유틸리티 file 김승훈 2015.12.08 12018
18 기타 CUBRID Migration Toolkit을 이용한 단계별 마이그레이션 진행 방법 file 진우진 2015.12.15 9494
17 Linux 리소스를 제한(limits.conf) 하여 DB서버를 관리하자 1 주현 2015.12.31 26551
16 기타 데이터 확인에 정규표현식을 사용 해 보자. 성진 2016.03.01 12688
15 기타 CSQL 인터프리터 사용방법 정만영 2016.03.03 16513
14 기타 PyCharm을 이용한 CUBRID, Django 연동 가이드 file 진우진 2016.04.11 8131
13 Java CUBRID에서 Java AddBatch 사용 엄기호 2016.06.28 8339
12 튜닝 LIMIT절을 사용하여 SQL문을 간결하게 작성하고, 부분범위 처리를 유도하자. 권호일 2016.06.29 15441
11 Java tomcat8.0(DBCP2)과 CUBRID 연동하기 손승일 2016.07.01 15525
10 튜닝 다중컬럼 조건에 대한 인라인뷰 처리방안 2 박동윤 2016.12.27 5983
9 Java JDBC를 사용한 다중화 구성 SELECT Query 부하 분산 가이드 file 윤준수 2017.03.30 3918
8 Linux 리눅스에서 top 명령어를 통한 CPU 점유율 확인 및 측정하기 file 정훈 2017.06.02 79893
7 기타 따라하면 쉬운 compactdb 사용법 file 허서진 2017.07.01 2499
Board Pagination Prev 1 ... 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