본문으로 바로가기

[JAVA] 자바 MD5 암호화 (단방향 암호화)

category Backend/Java 2021. 8. 14. 15:30

목차

    0. MD5 암호화 들어가기 전에

    0.1. MD5 암호화 란?

    - Message-Digest algorithm 5 

    - MDC(Modification Detection Code:변경 탐지 코드) 

    - 단방향 알고리즘

    - 1991년에 로널드 라이베스트가 이전에 쓰이던 MD4를 대체하기 위해 고안된 알고리즘이다.

    - 임의의 길이의 메시지(variable-length message)를 입력받아, 128비트짜리 고정 길이의 값을 출력합니다.

    - 입력 메시지의 길이 제한이 없습니다.

    - 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용됩니다.

    - 현재 MD5 알고리즘은 보안 관련 용도로 권장하지 않습니다.

    0.2. MessageDigest Class

    - java.security.MessageDigest

    - MessageDigest 클래스는 MD5 또는 SHA 등의 메시지 암호화 알고리즘의 기능을 제공합니다. 

     

    사용할 주요 메소드

    (더 많은 메소드는 자바 API Document를 참고해 주세요)

    MessageDigest 주요 메소드

     


    1. MD5 암호화

    - MD5 암호화 + Hex(16진수) 인코딩, MD5 암호화 + Base64 인코딩을 사용했습니다.

    - 인코딩 라이브러리는 기본 라이브러리(DatatypeConverter) 또는 다운로드하여 사용할 수 있는 외부 라이브러리(Apache Commons)를 사용하시면 됩니다.

    - 기본 라이브러리(DatatypeConverter)는 java-1.8.0-openjdk-1.8.0.242 에서 작동되는 것을 확인 했습니다. 버전에 따라 실행이 안될 수도 있습니다.

    - 인코딩은 문자나 기호들의 집합을 컴퓨터에 저장하거나 통신에 사용할 목적으로 사용합니다.

     

    Apache Commons 라이브러리 링크: http://mvnrepository.com/artifact/commons-codec/commons-codec/1.9

    프로젝트에 다운로드한 라이브러리 추가하기

     

    [Eclipse] 프로젝트에 jar 파일 추가하는 방법 (자바 라이브러리 추가)

    목차 0. jar파일 이란? - JAR(Java Archive, 자바 아카이브)는 여러 개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼

    veneas.tistory.com

    1.1. MD5 암호화 + Hex(16 진수) String

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import javax.xml.bind.DatatypeConverter;
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.codec.binary.Base64;
    
    public class Md5Class {
    
    	public static void main(String[] args) throws NoSuchAlgorithmException {
    
    		String text = "md5 Test Text";
    
    		System.out.println("md5 암호화 + Hex: "+ md5AndHex(text) );
    		System.out.println("md5 암호화 + Hex: "+ md5AndHex_apache(text) );
    	}
    	
    	//MD5 암호화와 Hex(16진수) 인코딩
    	public static String md5AndHex(String plainText) throws NoSuchAlgorithmException {
    	    
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance("MD5");
    	    
    		//해쉬값 업데이트
    		md.update(plainText.getBytes());
    	   
    		//Byte To Hex String
    		return DatatypeConverter.printHexBinary(md.digest());
    	}
    
    	//MD5 암호화와 Hex(16진수) 인코딩  apache.commons
    	public static String md5AndHex_apache(String plainText) throws NoSuchAlgorithmException {
    	    
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance("MD5");
    	    
    		//해쉬값 업데이트
    		md.update(plainText.getBytes());
    	    
    		//Byte To Hex String(apache)
    		return Hex.encodeHexString(md.digest());
    	}
    	
    }

    결과 값: 

    md5 암호화 + Hex: 5EC9B1823912C4CBA4CF38C588C166DB
    md5 암호화 + Hex: 5ec9b1823912c4cba4cf38c588c166db

    주의: 16진수 변환 시 DatatypeConverter는 결과 값으로 대문자로 출력하지만 Apache Commons는 소문자로 출력합니다.

    1.2. MD5 암호화 + Base64 String

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import javax.xml.bind.DatatypeConverter;
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.codec.binary.Base64;
    
    public class Md5Class {
    
    	public static void main(String[] args) throws NoSuchAlgorithmException {
    
    		String text = "md5 Test Text";
    		
    		System.out.println("md5 암호화 + Base64: "+ md5AndBase64(text) );
    		System.out.println("md5 암호화 + Base64: "+ md5AndBase64_apache(text) );
    	}
    	
    	//MD5 암호화와 Base64 인코딩
    	public static String md5AndBase64(String plainText) throws NoSuchAlgorithmException {
    		
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance("MD5");
    		
    		//해쉬값 업데이트
    		md.update(plainText.getBytes());
    		
    		//Byte To Base64 String
    		return DatatypeConverter.printBase64Binary(md.digest());
    	}
    
    	//MD5 암호화와 Base64 인코딩 apache.commons
    	public static String md5AndBase64_apache(String plainText) throws NoSuchAlgorithmException {
    
    		//MessageDigest 인스턴스 생성(MD5)
    		MessageDigest md = MessageDigest.getInstance("MD5");
    		
    		//해쉬값 업데이트
    		md.update(plainText.getBytes());
    
    		//Byte To Base64 String(apache)
    		return Base64.encodeBase64String(md.digest());
    	}
    	
    }

    결과 값: 

    md5 암호화 + Base64: XsmxgjkSxMukzzjFiMFm2w==
    md5 암호화 + Base64: XsmxgjkSxMukzzjFiMFm2w==