Coding Planet

[Java]MessageDigest 클래스 - 단방향 암호화 기능 제공 본문

카테고리 없음

[Java]MessageDigest 클래스 - 단방향 암호화 기능 제공

jhj.sharon 2023. 3. 27. 18:08
반응형

 

 

 

암호화 필터를 공부하면서 사용자가 입력한 비밀번호 등 암호화가 필요한 정보를 SHA-512를 통해 암호화했다.
SHA-512는 비밀번호를 해시화시키는 알고리즘인데 이 과정에서 MessageDigest 클래스를 활용했다.

 

 

1. MessageDigest 클래스란?

 

  • MessageDigest 클래스는 자바에서  단방향 해시 함수 값을 구할 때 사용한다. 
  • 사용자가 웹페이지에서 로그인을 할 경우 개인정보보호법에 의해 비밀번호를 그대로 서버에 저장하는 것이 아니라 해시값으로 변환하여 저장하게 되는데 이 때 사용되는 MD5 또는 SHA등의 메세지 다이제스트 알고리즘의 기능을 제공한다.
  • SHA-512란 256bit 암호화 해시 함수를 의미한다.

 

2. MessageDigest에서 자주 사용하는 메서드

  • getInstance(String algorithm) : 입력한 해시 알고리즘을 수행하는 MessageDigest 객체를 생성한다. 이 때 NoSuchAlgorithmException이 발생하기 때문에 try/catch문으로 예외처리를 해줘야한다.
  • update(byte[] input) : 객체 내에 저장된 digest값을 갱신한다.
  • digest(): update()된 값을 바이트 배열로 해시를 반환한다.

 

 

 

3. 예제 코드

  • getByte("UTF-8")은 유니코드 문자열(String)을 바이트고드로 인코딩해주는 메서드 이다. 만약 getBytes()의 인자로 Charset을 넘기지 않으면 사용자 플랫폼의 기본 Charset으로 인코딩된다.
package edu.kh.community.common.wrapper;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class EncrpytWrapper extends HttpServletRequestWrapper {
	
	public EncrpytWrapper(HttpServletRequest request) {
		super(request);
		
	}

	//getParameter() 오버라이딩
	@Override
	public String getParameter(String name) {
		
		String value = null;
		
		switch(name) {
		case "inputPw":
		case "memberPw" :
		case "currentPw" :
		case "newPw":
			value = getSha512(super.getParameter(name));
			
			break;
			
			
			default : value = super.getParameter(name);
		}
		
		return value;
	}
	
	//암호화 메서드(SHA-512 해시 함수)

	private String getSha512(String pw) {
		//매개변수 pw : 암호화되기 이전의 비밀번호, 입력값
		
		//암호화된 비밀번호 저장 변수
		String encryptPw = null;
		
		//1. 해시 함수를 수행할 객체를 참조 변수 선언
		MessageDigest md = null;
		
		try {
			//2. SHA-512 방식의 해시 함수를 수행할 수 있는 객체를 얻어옴
			md = MessageDigest.getInstance("SHA-512");
			
			//3. md를 이용해 암호화를 진행할 수 있도록 pw를 byte[] 형태로 변환
			byte[] bytes = pw.getBytes(Charset.forName("UTF-8"));
			
			//4. 암호화 수행 -> 암호화 결과가 md 내부에 저장
			md.update(bytes);
			
			//5. 암호화된 비밀번호를 encryptPw에 대입
			// -> byte[]를 String 변환해야함
			// -> Base64: byte 코드를 무자열로 변화하는 객체
			encryptPw = Base64.getEncoder().encodeToString(md.digest());
			
			System.out.println("암호화 전: " + pw);
			System.out.println("암호화 후: " + encryptPw);
			
		}catch(NoSuchAlgorithmException e) {
			e.printStackTrace();
			
		}
		
		return encryptPw;
	}
	
	
	
	
	
	

} //end of class

 

**암호화 결과

반응형
Comments