관리 메뉴

ballqs 님의 블로그

[Spring] PasswordEncoder 암호화 및 bcrypt 암호화 본문

코딩 공부/Spring

[Spring] PasswordEncoder 암호화 및 bcrypt 암호화

ballqs 2024. 8. 23. 09:09

PasswordEncoder 암호화

현재 듣고 있는 강의에서는 이러한 내용을 가르쳐 주었다.

implementation 'org.springframework.boot:spring-boot-starter-security'

 

security DI를 추가하고

@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        // Hash 함수 비밀번호를 암호화해줌
        // 해당 메서드를 사용해서 비밀번호를 encoding하는 것
        return new BCryptPasswordEncoder();
    }
}

 

PasswordEncoder를 수동적으로 bean등록하여 사용 하는 방식이다.

 

내부에는 어떤 것들이 있는지 살펴보면 encode , matches 등 비밀번호 암호화 및 비교작업하는 것들이다.


bcrypt 암호화

bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤 한 salt를 생성하기 때문에 같은 문자열에 대해서 매번 다른 해싱 결과를 반환한다. 또한 해시 값 내부에 salt 값이 포함되기 때문에 salt 값을 따로 저장하지 않아도 해싱된 값과 평문을 비교할 수 있다는 특징이 있다.

 

사용방법

DI 추가

implementation 'at.favre.lib:bcrypt:0.10.2'

 

Component 작성

@Component
public class BCryptEncryptor {

    public String encode(String rawPassword) {
        return BCrypt.withDefaults().hashToString(BCrypt.MIN_COST, rawPassword.toCharArray());
    }

    public boolean matches(String rawPassword, String encodedPassword) {
        BCrypt.Result result = BCrypt.verifyer().verify(rawPassword.toCharArray(), encodedPassword);
        return result.verified;
    }
}

 

적용 사례

    public UserSignupDto createUser(UserInsertDto userInsertDto , HttpServletResponse res) {
        String name = userInsertDto.getName();
        String email = userInsertDto.getEmail();

        Optional<User> checkUserName = userRepository.findByName(name);
        if (checkUserName.isPresent()) {
            throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
        }

        Optional<User> checkUserEmail = userRepository.findByEmail(email);
        if (checkUserEmail.isPresent()) {
            throw new IllegalArgumentException("중복된 Email입니다.");
        }

        // 비밀번호 암호화
        String pw = bCryptEncryptor.encode(userInsertDto.getPw());

        User user = new User(name , email , pw);

        // JWT 생성 및 헤더에 저장 후 Response 객체에 추가
        String token = jwtUtil.createToken(name);
//        jwtUtil.addJwtToHeader(token , res);

        return new UserSignupDto(userRepository.save(user) , token);
    }

적용하기 전까지는 pw에 값이 없으나 적용 후 들어간 값을 보면 암호화로 되어 있다.

 

참조 GitHub

https://github.com/patrickfav/bcrypt

 

GitHub - patrickfav/bcrypt: A Java standalone implementation of the bcrypt password hash function. Based on the Blowfish cipher

A Java standalone implementation of the bcrypt password hash function. Based on the Blowfish cipher it is the default password hash algorithm for OpenBSD and other systems including some Linux dist...

github.com