암호화 (Encrypt Filter)

DeadWhale·2022년 5월 4일
0

Servlet/JSP

목록 보기
10/22
post-thumbnail

암호화

클라이언트가 전달한 데이터가 서버(서블릿쪽)에 도착하기 전 이미 암호화가 되어있어야 한다.
(서버쪽에서는 암호화된 데이터를 다뤄야 한다.)

< EncryptFilter >

Encrypt : 암호화
암호화 하는 필터

EncryptFilter

보안이 필요한 Servlet(로그인,회원가입,비밀번호 변경,회원 탈퇴)
등이 호출되면 Encrypt(암호화)필터를 지나가게 된다 이때 암호화 필터링을 하게 된다. 하지만 이 필터에서는 직접적으로 보안이 필요한 비밀번호 자료를 세팅할 수 없다 이를 해결하기 위해서는
Wrapper을 사용해서 오버라이딩(재정의)을 하고 반환 받아와야 한다.

EncryptWrapper

호출받은 필터에서 HttpServletRequest 객체를 매개변수로 전달 받는다

이 때 생성자를 매개변수 생성자만 생성해 기본생성자를 만들지 않는다

오버라이딩에서 해쉬함수를 사용해 암호화 과정을 거친 후 암호화된 value를 리턴한다.

다시한번 적어보기

필터에 들어와 HttpServlerRequest 객체에
비밀번호 정보가 담겨 있는 상태 이지만
ServletRequest 객체로 다운 캐스팅을 진행 해도
저장되어 있는 Parameter값을 다시 세팅 혹은 수정 하는 방법은
필터에서 불가능하다


이러한 상황에 값을 변경하기 위해서는
Wrapper 클래스를 통해 메서드를 오버라이딩 할 수 있다 이를 이용해서 비밀번호를 암호화 한다.


암호과 Wrapper

public class EncryptWrapper extends HttpServletRequestWrapper{

	public EncryptWrapper(HttpServletRequest request) {
		super(request);
	}

	
	@Override
	public String getParameter(String name) {

		String value = null;
		
		switch(name){
		case "inputPw" : //입력된 비밀번호 
		case "memberPw" :  //로그인된 유저의 비밀번호
			value = getSha512(super.getParameter(name)); 
			break;
			
			default : value = super.getParameter(name); 
		}
		return value;
	}
	
		private String getSha512(String 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")); 
            //UTF-8 문자열인거 감안하고 변환해라라는 의미
			
			// 4) 암호화  -> 암호화 결과가 md 내부에 저장함.
			md.update(bytes);
 			
			// 5) 암호화된 비밀번호를 encryptPw에 대입
			//digest가 보관하고 있다
			//byte[]배열을 String으로 변환할 필요가 있다.
			encryptPw = Base64.getEncoder().encodeToString(md.digest());
		//Base64 : byte 코드를 문자열로 변환하는 객체
		//base64 에서 변환할수 있게 해주는 객체를 가져와 변환한다
			
		}catch(NoSuchAlgorithmException e) {
			//SHA-512 해시 함수가 존재하지 않을 때 예외 발생
			e.printStackTrace();
		}
		return encryptPw;
	}
}

암호화의 가장 쉬운 방법중 하나인 SHA512 방식
나중에는 다른 방식을 통해 문자열을 추가하는 솔트 기법도 있다고 한다.

0개의 댓글