[SPRING] 패스워드 암호화하기 -Mybatis 이용하기

🐷Jinie (juniorDeveloper)·2020년 12월 15일
1

JSP/MVC/SPRING

목록 보기
80/81

0. SHA256.java 와 BCrypt.java (해시함수)

암호가 필요한 개인 정보
1. 비밀번호
2. 바이오정보
3. 주민등록번호 ( 2014년 8월 7일 부터 수집금지)
4. 신용카드 번호
5. 계좌번호
6. 여권번호
7. 운전 면허번호
8. 외국인 등록 번호
등 이면 이들 정보들은 데이터베이스에 저장 및 통신망을 통해 송/수신되는 경우 반드시 암호화 되어야 한다.

  • KISA 에서 제공하는 SHA256.java (64개의 문자로 암호화) 와 Miller 가 만든 BCrypt.java 를 사용하면 60 개의 문자로 재 암호화 된다.
    따라서 데이터베이스의 비밀번호 저장 크기는 문자 60개로 필드를 설정하면된다.
    1) 비밀번호는 해시 함수를 이용하여 암호화 해야한다.
    2) 해시함수는 복호화 할 수 없다.

1. 아이디와 암호를 담을 테이블 생성

CREATE TABLE LOGIN (
ID VARCHAR2(5) NOT NULL PRIMARY KEY,
PWD VARCHAR2(10) ,
PWD1 NVARCHAR2(50) ,
PWD2 NVARCHAR2(50) 
);

2. Mybatis 프로젝트 만들기

  • JSP Test문구가 잘 올라오는지 서버에 문제가 없는지 확인

  • loginVo
package com.spring.biz;

public class LoginVo {
	private String id;
	private String pwd;
	private String pwd1;
	private String pwd2;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getPwd1() {
		return pwd1;
	}
	public void setPwd1(String pwd1) {
		this.pwd1 = pwd1;
	}
	public String getPwd2() {
		return pwd2;
	}
	public void setPwd2(String pwd2) {
		this.pwd2 = pwd2;
	}
	@Override
	public String toString() {
		return "LoginVo [id=" + id + ", pwd=" + pwd + ", pwd1=" + pwd1 + ", pwd2=" + pwd2 + "]";
	}	
}
  • 사용자가 요청한 값을 받을 JSP 폼 만들기
    : method를 POST를 이용해서 주소창에 pwd가 노출되지 않도록 처리했다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>회원가입하기</h2>
<form action="join.do" method="post"> 
<table>
	<tr>
		<td>아이디</td>
		<td>
			<input type="text" name="id">
		</td>
	</tr>
	<tr>
		<td>패스워드</td>
		<td>
		  <input type="text" name="pwd">
		</td>
	</tr>
	<tr>
		<td colspan=2>
			<input type="submit" value="가입하기">
		</td>
	</tr>
</table>
</form>
</body>
</html>

3. 암호화에 필요한 파일준비하기

  • 준비한 SHA256과 BCrypt 파일을 프로젝트에 넣어준다.

4. Controller

  • 준비한 SHA256 클래스와 BCrypt 클래스를 이용해서 컨트롤러를 구성한다.
package com.spring.biz;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class LoginController {
	
	@Autowired
	LoginService s ;
	
	@RequestMapping (value="/join.do", method = RequestMethod.POST)
	public  String  insert(LoginVo  vo) throws Exception {
		
	      SHA256 sha = SHA256.getInsatnce();
	      String shaPass = sha.getSha256(vo.getPwd().getBytes());
	      String bcPass = BCrypt.hashpw(shaPass, BCrypt.gensalt());
	      
	      vo.setPwd1(shaPass);
	      vo.setPwd2(bcPass);
	      
	      s.insert(vo);
	      
		return "end.jsp";
	}
}

5. Service & DAO

  • Service
package com.spring.biz;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class LoginService {
	@Autowired
	LoginDAO dao;
	public void insert(LoginVo vo) {
		dao.insert(vo);
	}

}
  • DAO
package com.spring.biz;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class LoginDAO {
	@Autowired
	SqlSessionTemplate mybatis;
	public void insert(LoginVo vo) {
		mybatis.insert("LoginMapper.loginInsert", vo);
	}
}

6. Mapper 에 쿼리넣기

  • vo.setPwd1(shaPass);
    : Pwd1은 SHA256를 이용
    vo.setPwd2(bcPass);
    : Pwd2는 BCrypt를 이용
  • 각각의 방식으로 암호화된 값을 insert를 이용해서 암호화 저장
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="LoginMapper">

<insert id="loginInsert">
	<![CDATA[
       insert  into login ( id, pwd, pwd1, pwd2 )    
       values ( #{id} , #{pwd} ,#{pwd1} ,#{pwd2}  )
    ]]>
</insert>
</mapper>

7. 결과화면

  • 넣은 비밀번호 1234가 암호화되어 PWD1과 PWD2에 저장되는 것을 볼 수 있다.


profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

2개의 댓글

comment-user-thumbnail
2021년 6월 1일

혹시 로그인 할 때도 1234 할때 되시나요..?
데이터베이스에 암호화까지 해서는 저장이 되는데 로그인할때 암호화값을 입력해야하네요..
1234는 안됩니다.. 물론 올려주신 예제는 아니고 제가 하다가.. 이런 오류가 있어서 답을 찾고 있습니다.

저는 jsp 까지만 배웠고, mySQL 과 같이 쓰는 중입니다.

1개의 답글