본문 바로가기

Project

[Bcrypt] 비밀번호를 안전하게 저장하자

이번 프로젝트에서는 비밀번호를 Bcrypt로 안전하게 암호화해서 데이터베이스에 저장했다.

 

Bcrypt는 무엇일까?

 

우선 Bcrypt라는 것을 사용하게된 배경부터 알아보자.

보통 데이터베이스에 비밀번호를 저장할 때는 해시함수를 사용한다.

비밀번호의 원본을 그대로 저장하면 보안상의 문제가 생기기 때문이다.

 

그렇다면 해시함수만 사용한다면 안전할까?

어느 정도 보안성은 유지될 수 있지만 Rainbow Table Attack 앞에서는 무기력하다.

흔하게 많이 사용되는 SHA-256 해시함수의 경우 속도가 매우 빠르다는 장점이 있다.

그런데 이 장점이 보안적인 측면에서 오히려 단점으로 작용한다.

속도가 매우 빠르기 때문에 약 수십억개가 넘는 Plain Text의 해시 값을 미리 구해놓은 Rainbow Table 이라는 것이 존재한다.

이 Rainbow Table을 준비해놓고 데이터베이스에 저장되어 있는 비밀번호의 해시 값들을 비교하면 원본이 무엇이었는지 금세 찾아낼 수 있다.

그래서 사용되는 것이 바로 Bcrypt다.

 

Bcrypt의 동작 순서는 대충 이렇다.

1. 난수를 하나 생성해서 원본 데이터에 이어 붙인다. (보통 이 난수를 salt 라고 부른다)

2. 그렇게 탄생한 새로운 데이터의 해시 값을 구한다.

3. 해시 값에 또 해시함수를 적용시켜 또 다시 새로운 해시 값을 얻는다.

4. 3번 과정을 수백, 수천 번 과하게는 수만 번 반복한다.

 

이렇게 했을때 장점이 2가지가 있다.

보통 사람이 기억하기 쉬운 비밀번호의 길이에는 한계가 있기 때문에 약 10자 내외의 짧은 비밀번호를 설정한다.

길이가 짧은 문자는 웬만하면 Rainbow Table을 사용해 알아낼 수 있다.

하지만 salt를 생성해서 붙이게 되면 Rainbow Table을 이용해도 쉽게 알아낼 수 없다.

 

그리고 여러 번 해시함수를 돌리기 때문에 SHA-256 보다는 오랜 시간이 걸린다.

따라서 브루트한 방법으로 비밀번호를 찾아내려면 매우 오랜시간이 걸릴 것이다.

나중에 컴퓨터의 성능이 좋아져서 속도가 매우 빨라진다해도 해시를 반복하는 횟수만 늘린다면 충분히 대처가 가능하다.

 

Bcrypt로 암호화한 내용은 다음과 같이 표현된다.

 

$[알고리즘]$[라운드수]$[salt].[해시결과]

 

알고리즘 : 해시함수의 알고리즘을 표기한다.

라운드수 : 해시를 몇번 반복하는지 표기한다. 만약 값이 12라면 2의 12승 만큼, 즉 4096번 반복한 것이다.

salt : 원본 데이터에 이어 붙인 salt 값

해시결과 : 최종 암호화된 값

 

Bcrypt외에도 다양한 암호화 기법이 있지만 짧은 Plain Text를 암호화할때는 Bcrypt가 참 좋아보인다.