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 |
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 |
* bcrpt 해싱 분석
앞의 4byte $2a$는 bcrypt 알고리즘을 이용한 다이제스트 명시
10$는 Cost를 의미 2^(cost)번 반복하여 만들어 졌다고 명시
그 다음의 22byte bcrypt에 사용된 salt 의미. (salt는 128bit를 base64인코딩하여 22개의 문자열을 갖음)
그 다음의 31byte는 해시 결과값
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 |
입력한 비밀번호와 암호화된 비밀번호를 매칭해서 boolean타입으로 여부를 알려준다.
메소드 |
설명 |
String encode(String password) |
사용자가 입력한 Password를 암호화 (회원가입시) |
boolean matches(String inputPw, String dbPw) | 사용자가 입력한 Password와 DB에 저장된 Password 비교 (로그인시) |
'Backend FrameWork > Spring' 카테고리의 다른 글
[SpringFrameWork] Tiles 사용법 (0) | 2019.01.23 |
---|---|
[SpringFrameWork] Google SMPT 사용법 (0) | 2019.01.22 |
[SpringFramework] slf4j, Logback 사용 (0) | 2019.01.01 |
[Spring Framework] Spring MVC : @RequestMapping 개념 (0) | 2018.12.28 |
[Spring Framework] Spring MVC : Model과 ModelAndView 차이 (0) | 2018.12.28 |