본문 바로가기
Backend FrameWork/Spring

[SpringFrameWork] Spring Security - Bcrypt

by IsBerry 2019. 1. 17.
반응형

Spring Security - Bcrypt

 

 




Bcrypt란?

 : Blowfish 알고리즘을 기반으로 설계한 암호화 해시 알고리즘.

   단방향 암호화 방식

   Spring Security에서 제공하는 암호화 종류 중 하나

   패스워드를 저장하기 위한 목적으로 개발됨.


장점

 : 패스워드 암호화에 최적화 되어있다.

   단방향 암호화의 단점을 보안하기 위해 솔팅이 추가됨.

  

    * 솔팅 : 단방향 암호화 해시 함수의 단점 보완 

               다이제스트를 생성할 때 추가하는 임의의 문자열. (고유의 솔트를 갖고 32비트 이상 되어야 안전함)

  

    * 다이제스트 : 암호화된 메시지

단점

 : 128byte를 맞추기 위해 72byte로 제한함. (제약을 벗어나기 위해 script를 대안으로 사용하기도 함)



사용방법

  : 회원가입 시 비밀번호를 DB에 넣을 때 암호화하여 넣을 때 사용한다.


  1. pom.xml에 Spring Security 라이브러리 설정추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
       <version>${org.springframework-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
cs
 * version사용하고 있는 버전으로 입력 



 2. Dispatcher의 servlet-context.xml에 Bean 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
    // .....
 
    <beans:bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />  

</beans:beans>
cs


 * servlet-context.xml에 추가 하거나 새로운 xml에 넣고 Dispatcher에 추가해도 된다.


  

3. 암호화를 하고 싶은 해당 @Controller or @Service or @Repository에 Bean연결

    * 본인은 암호화는 @Controller 

                암호 매칭은 @Repository에서 하였음.


  1) @Controller에서 암호화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
//...
@Inject
BCryptPasswordEncoder passwordEncoder;
  
//...
 
// 회원 등록 
@RequestMapping(value ="joining", method = RequestMethod.POST)
public String userJoining(@ModelAttribute UserVO vo) throws Exception
{
    String pwdBycrypt = passwordEncoder.encode(vo.getUserPw());
    vo.setUserPw(pwdBycrypt);
    userService.insertUser(vo);
    return "user/joining";
}
cs


 View에서 받은 정보 중에 비밀번호를 꺼내서 passwordEncoder.encode()메소드에 넣어 암호화 시킨다.
 
 * Bcypt로 암호화하여 저장을 하면 같은 패스워드 ex) 1234 를 입력하더라도 
   입력할 때마다 암호화된 값이 다르게 나오는걸 볼수 있다. (아래는 전부 1234를 입력한 값이다.)

   

   * bcrpt 해싱 분석

     앞의 4byte $2a$는 bcrypt 알고리즘을 이용한 다이제스트 명시

     10$ Cost를 의미 2^(cost)번 반복하여 만들어 졌다고 명시

     그 다음의 22byte bcrypt에 사용된 salt 의미. (salt는 128bit를 base64인코딩하여 22개의 문자열을 갖음)

     그 다음의 31byte 해시 결과값


2) @Repository에서 암호 매칭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
//...
 
@Inject
BCryptPasswordEncoder passwordEncoder;
//...
// 회원 로그인체크
@Override
public boolean loginCheck(UserVO vo) 
{
    // 로그인 비밀번호 db매칭
    String checkPw = sqlSession.selectOne("user.loginCheck", vo);
    boolean matchPw = passwordEncoder.matches(vo.getUserPw(), checkPw);
        
    return matchPw;
}
cs

 데이터베이스에 패스워드가 암호화되어 저장되어 있기 때문에 사용자가 입력 했을 경우 
 Matches메소드를 사용하여 비교할 수 있다.
 * Matches메소드를 사용하지 않으면, 비밀번호를 입력할 떄마다 다르게 암호화되므로 매치가 안됨.

 sqlSession으로 로그인 하는 ID로 암호화된 비밀번호를 꺼내온 후 

 입력한 비밀번호와 암호화된 비밀번호를 매칭해서 boolean타입으로 여부를 알려준다.



메소드

메소드

 설명

  String encode(String password) 

  사용자가 입력한 Password를 암호화 (회원가입시) 

  boolean matches(String inputPw, String dbPw)  사용자가 입력한 Password와 DB에 저장된 Password 비교 (로그인시)



반응형