BCrypt에 대해 알아보자

구동현·2024년 4월 22일

Spring security로 인증/인가 과정을 구현하면서,
passwordEncorder로 비밀번호를 암호화했다.

	@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

PasswordEncoder를 빈으로 생성하는 과정에서 BCryptPasswordEncoder를 선택했다.

BCryptPasswordEncoder는 PasswordEncoder를 상속받는 클래스로, BCrypt 암호화 방식을 사용했다.


BCrypt

BCrypt는 단방향 암호화 방식이다.

단방향?

단방향이란,
암호화는 되는데,
복호화(암호해독)은 안되는 것을 말한다.

중요 정보를 저장하는것에 유용해보이지만,
만약 공격자가 레인보우 테이블로 공격한다면 경우가 다르다.

레인보우 테이블?

한 비밀번호에 대해서 암호화를 할 때마다,
암호문은 항상 똑같을 것이다.

만약 내 비밀번호가 kudongku이고,
어떤 공격자가 kudonghyun, dongku, kudong 등 무수히 많은 시도를 통해 데이터를 저장하는 테이블을 만든다면,
내 비밀번호를 논리적으로 추론하는 것이 가능할 것이다.

BCrypt가 좋은 이유

BCrypt는 이런 공격을 피하기 위해서,
솔팅과 스트레칭의 방식을 사용한다.

솔팅?

솔팅은 암호화된 암호문에 랜덤한 솔팅을 추가하는것이다.
(sort가 아닌, salt)

항상 랜덤한 솔트를 추가하는 것이기 때문에,
하나의 비밀번호를 암호화할때마다 다른 암호문이 나오게 되면서,
레인보우 테이블 공격이 힘들어지게 된다.

스트레칭?

스트레칭은 암호화를 반복하는 과정이다.
암호화하고 비밀번호 시도를 하는 과정이 매우 빠르게 리소스도 적기 때문에,
1초에 50만번씩 시도하게 되면, 어떻게든 암호를 풀 수 있을 것이다.
하지만 여러번 암호화를 시도한다면,
인증/인가 과정에서 오래걸리는 것은 크게 문제가 되지 않고,
공격자들은 노가다를 통해 공격을 하기가 힘들어지게 된다.

profile
개발합시다

0개의 댓글