본문 바로가기
괴발개발/DB

db보호를 위한 암호화 필터(로그인,회원가입, 비밀번호 변경, 회원탈퇴)

by 맛길만걷자 2024. 7. 2.
728x90
반응형

개인정보에 해당하는 비밀번호의 경우 개인정보보호법에 의해 암호화를 해야하는데, 이를 위해 암호화 필터가 필요.

db에 비밀번호 그대로 노출되면 관리자가 멋대로 악용하거나 해킹 당했을 때 바로 노출될수 있으므로 암호화 필터가 필요하다.

 

암호화를 적용해야되는 요청 : 로그인, 회원가입, 비밀번호 변경, 회원 탈퇴

필터가 적용될 url이 여러 개인 경우 : String 배열 초기화 형태로 {}작성

common패키지안에 필터패키지 EncrpytFilter를 만들어준다. (ctrl+n) :filter 검색

 

@WebFilter(filterName = "encryptFilter", urlPatterns = {"/member/login",
d"/member/signUp"})

public class EncrpytFilter extends HttpFilter implements Filter{

	public void init(Filterconfig fConfig) throws DervletException{}
	
	public void destroy(){}
	
	public void doFilter(ServletRequest request, ServletRespopnse response,FilterChain chain) throws IOException, ServletException { 
	  // 비밀번호 파라미터 -> HttpServletRequest에 담겨있음
      
      // doFilter 메소드의 매개변수는 부모타입인 ServletRequest
      // -> 다운 캐스팅 필요
      
      HttpServletRequest req = (HttpServletRequest)request;
      // 얻어오는건 가능, 세팅은 안됨 wrapper로 감싸면 세팅 추가 가능
      // 파라미터를 다시 세팅하는 방법은 필터에서 불가능함
      // -> Servlet의 Wrapper 클래스를 이용해서
      //    HttpServletRequest 메소드를 오버라이딩 할 수 있다
      //    -> 오버라이딩(제정의)를 통해서 비밀번호 암호화 진행

      
      // wrapper 객체를 생성해서 기존 HttpServletRequest 객체 역할을 대체함
      EncryptWrapper wrapper = new EncryptWrapper(req);
      
      // 다음 연결된 필터를 수행(없으면 Servlet으로 이동)
      chain.doFilter(wrapper, response);
   }
}


EncrptWrapper 클래스를 만들어준다.

 

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 EncryptWrapper extends HttpServletRequestWrapper {
   
   // HttpServletRequestWrapper
   // - 클라이언트 요청 객체 HttpServletRequest를 오버라이딩하는 방법을 제공하는 클래스

   // -> Wrapper 클래스 생성 시 반드시 HttpServeltRequest를 전달해야 한다
   public EncryptWrapper(HttpServletRequest request) {
      super(request);
   }

   // getParameter() 오버라이딩
   @Override
   public String getParameter(String name) {
      // 매개변수 name : input 태그의 name 속성 값
      // super.getParameter(name) : 기존 getParameter() 메소드
      
      String value = null;
      switch(name) {
         case "inputPw" : 
         case "memberPw" : 
            value = getSha512(super.getParameter(name));
            break;
      
         // 암호화 되는 경우가 아니라면 기존 getParameter() 메소드의 형태를 유지
         default : value = super.getParameter(name);
      }
      return value;
   }
   
   // 암호화 메소드(SHA-512 해시 함수)
   // 해시 함수 : 어떤 문자열이든 일정한 길이의 무작위한 문자열로 변환하는 함수(중복 X)
   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. 암호화된 비밀번호를 encyptPw에 대입
         // -> byte[]을 String으로 변환해야함
         //    Base64 : byte 코드를 문자열로 변환하는 객체
         encryptPw = Base64.getEncoder().encodeToString(md.digest());
         
         System.out.println("암호화 전 : " + pw);
         System.out.println("암호화 후 : " + encryptPw);
      } catch (NoSuchAlgorithmException e) {
         // SHA-512 해시 함수가 존재하지 않을 때 예외 발생
         e.printStackTrace();
      }
      
      return encryptPw;
      
   }
   
   
   
}

 

db에서 로그인했을때 콘솔에 나오는 암호화를 보고 넣어줌

ex))암호화된 비밀번호로 업데이트

 

UPDATE MEMBER SET MEMBER_PW = 'aBN5hiegXlvAovJLipPoPd5LB+xjPrAeu1tcAVg0p5MKGocvo6l825SD+ZMCOcHBFeGB7MnzH31SAnDzYYsSdg==' WHERE MEMBER_NO = 1;

 

COMMIT;

꼭 commit 까지 해줄것.

728x90
반응형

'괴발개발 > DB' 카테고리의 다른 글

DataBass connection pool 커넥션 풀 (DBCP)  (0) 2024.06.27
ORDER BY  (0) 2024.06.01
NULL 연산자  (0) 2024.06.01
IN 연산자, 연결연산자(||)  (0) 2024.05.29
SQL 연산자 우선순위  (0) 2024.05.28