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

암호화 필터를 공부하면서 사용자가 입력한 비밀번호 등 암호화가 필요한 정보를 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
**암호화 결과

반응형