BCrypt

fixme·2021년 3월 20일
0

BCrypt는 단방향 암호화.

스프링부트에서 주로 BCrypt을 쓴 PasswordEncoder를 사용하게 될텐데

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
    
    @Autowired
    PasswordEncoder passwordEncoder;
    
    String encrypted = passwordEncoder.encode(rawPassword);
    Boolean isSuccess = passwordEncoder.matches(rawPassword, encrypted);
    log.info("Encrypted String is {}", encrypted);
    
    
    $2a$10$3H3bk6hpbA8sUbrkGu8/JesQqyLXq4FgGq003CUQmvzBTbfEz0KLu    

위와 같이 사용할일이 많을 것이다.

크게 고민없이 쓰다가 문득 이런 생각이 들었다.

Salt는 어디에 있는거지...?

찾아본 결과 해쉬를 하면서 매번 다른 Salt를 적용한다고 한다.
그래서 Salt가 어디있냐고..

Spring Security의 BCryptPasswordEncoder를 뜯으니 다음과 같았다.

스프링에서는 보통? 기본값?으로 strength는 10, BCrypt version은 2a를 주로 사용하는 듯 하다.
사실 스프링뿐만 아니라 기본적으로 10번 해시하는 것이 대부분인 것 같다. (아직은?)

encode 메소드 내에서 gensalt을 하는 것을 찾을 수 있었다.

그렇다면 gensalt는?

encode_base64는 말 그대로 salt를 base64로 변환하는 것이었고,
하여튼 encode를 하면서 매번 랜덤하게 salt를 생성하는 것을 알 수 있었다.

그리고 그 salt를 base64 인코딩후에 암호화한 문자열 앞단에 붙여서 저장한 후에,

$2a$10$salt...

평문?의 해쉬값을 salt 뒤에 다시 붙여서 저장하는 것이었다.

그렇게 어려운 개념도 아니었는데, 몰라도 너무 무식했었다.

지금도 완벽하진 않은 것 같지만 :(

profile
코드로말해요

0개의 댓글