Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ㅒ
- iterator
- 스프링 시큐리티
- 자료구조와함께배우는알고리즘입문
- 코드로배우는스프링웹프로젝트
- 목록처리
- 코드로배우는스프링부트웹프로젝트
- baeldung
- d
- /etc/network/interfaces
- 자료구조와 함께 배우는 알고리즘 입문
- 처음 만나는 AI 수학 with Python
- 처음 만나는 AI수학 with Python
- 자바편
- 페이징
- 리눅스
- GIT
- 선형대수
- 데비안
- network configuration
- 알파회계
- Kernighan의 C언어 프로그래밍
- 티스토리 쿠키 삭제
- resttemplate
- 스프링부트핵심가이드
- 구멍가게코딩단
- 서버설정
- 친절한SQL튜닝
- 이터레이터
- 네트워크 설정
Archives
- Today
- Total
bright jazz music
blog39 : 회원가입과 비밀번호 암호화-2 본문
비밀번호 저장을 위해 Scrypto 알고리즘을 사용한다.
Scrypto를 지원하는 다양한 라이브러리들이 존재한다.
이 프로젝트에서는 Spring security에서 지원하는 Crypto 라이브러리를 사용한다.
https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto
// https://mvnrepository.com/artifact/org.springframework.security/spring-security-crypto
implementation group: 'org.springframework.security', name: 'spring-security-crypto', version: '6.0.1'
1. build.gradle에 암호화 라이브러리 추가
2. AuthService.java에 비밀번호 암호화 로직 추가
//AuthService.java
//회원가입
public void signup(Signup signup) {
//email 중복체크
Optional<User> userOptional = userRepository.findByEmail(signup.getEmail());
if(userOptional.isPresent()) {
throw new AlreadyExistsEmailException();
}
//비밀번호 암호화 (cpuCost, memoryCost, parallelization, keyLength, saltLength)
//보통 salt는 uuid를 생성하여 65바이트로 넣어준다. 이 라이브러리는 내부적으로 하는 모양
SCryptPasswordEncoder encoder = new SCryptPasswordEncoder(16, 8, 1, 32, 64);
String encryptedPassword = encoder.encode(signup.getPassword());
//엔티티로 변환
var user = User.builder()
.name(signup.getName())
.password(encryptedPassword)
.email(signup.getEmail())
.build();
userRepository.save(user);
}
}
3. 회원가입 테스트
//AuthServiceTest.java
@Test
@DisplayName("회원가입")
void test1(){
//given
Signup signup = Signup.builder()
.email("catnails@gmail.com")
.password("1234")
.name("catnails")
.build();
//when
authService.signup(signup);
//then
Assertions.assertEquals(1, userRepository.count());
User user = userRepository.findAll().iterator().next();
Assertions.assertEquals("catnails@gmail.com", user.getEmail());
Assertions.assertEquals("1234", user.getPassword());
Assertions.assertEquals("catnails", user.getName());
}
문제 발생
org/bouncycastle/crypto/generators/SCrypt
java.lang.NoClassDefFoundError: org/bouncycastle/crypto/generators/SCrypt
at org.springframework.security.crypto.scrypt.SCryptPasswordEncoder.digest(SCryptPasswordEncoder.java:166)
at org.springframework.security.crypto.scrypt.SCryptPasswordEncoder.encode(SCryptPasswordEncoder.java:121)
SCryptPasswordEncoder 클래스 내부에서 사용하는 라이브러리가 존재하지 않아서 생기는 문제.
아래 라이브러리를 build.gradle에 추가하여 해결
https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on/1.70
재테스트
4. 테스트 통과시키기
암호화는 랜덤으로 진행되므로 우리가 결괏값을 예측할 수 없다. 따라서 다음과 같이 암호가 null이 아니며, "1234"와 같지 않다는 것으로 설정하여 성공시킨다.
//AuthServiceTest.java
@Test
@DisplayName("회원가입")
void test1(){
//given
Signup signup = Signup.builder()
.email("catnails@gmail.com")
.password("1234")
.name("catnails")
.build();
//when
authService.signup(signup);
//then
Assertions.assertEquals(1, userRepository.count());
User user = userRepository.findAll().iterator().next();
Assertions.assertEquals("catnails@gmail.com", user.getEmail());
Assertions.assertNotNull(user.getPassword());
Assertions.assertNotEquals("1234", user.getPassword());
// Assertions.assertEquals("1234", user.getPassword());
Assertions.assertEquals("catnails", user.getName());
}
성공
'Projects > blog' 카테고리의 다른 글
blog41 : 회원가입과 비밀번호 암호화-4 (0) | 2023.02.26 |
---|---|
blog40 : 회원가입과 비밀번호 암호화-3 (0) | 2023.02.26 |
blog38 : 회원가입과 비밀번호 암호화-1 (0) | 2023.02.26 |
blog37 : JWT를 이용한 인증 - 암호화 키 분리 및 개선 (0) | 2023.02.23 |
blog36 : JWT를 이용한 인증 - application.yml 커스텀 설정값 만들기 (0) | 2023.02.22 |
Comments