티스토리 뷰

JSP, NativeApplication, Android 등 어떤 프로그램이건 상관없이 서버측에서는 클라이언트의 비밀번호를 DB에 저장시 MD5, SHA256 등등 hash 알고리즘을 이용하여 저장 하여야 한다.

(hash 알고리즘은 복호화가 불가능 하므로 운영자도 회원의 비밀번호를 알 수 없다.)

 

그중 Bcrypt 알고리즘은 특히 비밀번호 암호화에 특화되어 있다.

일반적인 hash 알고리즘의 경우는 salt값을 따로 관리하지만, Bcrypt의 경우는 salt값을 따로 DB에 저장하지 않아도 된다.

jbcrypt라는 라이브러리가 제공되므로 해당 라이브러리를 이용한 기능 구현 방법을 작성 해본다.

(암호학 에서는 이미 검증된 알고리즘이 존재하므로 개인이 따로 구현해서 사용하지 말도록 권장한다고 한다.)

 

 

기능 구현은 Spring MVC 프로젝트를 기준으로 작성 한다.

 

1. maven 추가로 라이브러리 취득

<dependency>
	<groupId>org.mindrot</groupId>
	<artifactId>jbcrypt</artifactId>
	<version>0.3m</version>
</dependency>

 

2. 회원가입시 parameter로 받은 비밀번호를 DB저장 전 암호화

// 회원가입 처리
@RequestMapping(value = "/join", method = RequestMethod.POST)
public String join(User user) {
	// DB 저장 전 비밀번호 암호화
	String hashPassword = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
	user.setPassword(hashPassword);

	// DB 저장 로직 구현
}

 

3. 기존 회원이 로그인시 DB에 저장된 값과 비교

// (salt값을 따로 저장하지 않으므로 BCrypt의 메서드를 이용하여 parameter로 받은 평문과 hash값을 비교한다)
// 로그인 처리
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(User user, HttpSession session, RedirectAttributes ra) {
  User loginUser = userService.login(user.getEmail());
  if (loginUser != null) { // parameter로 받은 평문과 DB에 저장된 암호화값 비교
	  if (BCrypt.checkpw(user.getPassword(), loginUser.getPassword())) {
		  session.setAttribute("loginUser", loginUser);
		  return "redirect:/index";
	  }
  }

  // 해당 email을 가진 유저가 없거나 비밀번호 불일치
  ra.addFlashAttribute("resultMsg", "아이디 또는 비밀번호가 올바르지 않습니다.");
  return "redirect:/login";
}

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday