TL;DR
- 기본 해시 함수인 SHA, MD5등을 이용하는 것은 빠른 처리속도로 인하여 보안에 취약하기 때문에 충분히 사용자의 password를 보호할 수 없다.
- bcrypt는 공격자의 속도를 늦추고 해시 값이 매번 다르다
요즘 노드 백엔드 강의를 듣고 있다
강의에서 bcrypt에 대해 가볍게 알려주고 라이브러리를 받아서 사용해보았다
bcrypt는 해시 함수(hash function)이다
해시 함수란 간단히 말해 나머지 연산자를 이용해서 단방향으로 문자열을 변환하는 것이다
비밀번호를 DB에 저장할 때 해시함수를 거쳐 암호화된 문자열로 저장하는데
그 이유는 일부 사람들은 여러 사이트에 같은 비밀번호를 사용하는데 한 사이트가 해킹당했을 때 다른 사이트에서도 해킹을 당하는 것을 방지하기 위해 비밀번호를 암호화해서 저장한다
여기까지가 가볍게 알고 있는 내용이고 더 자세히 알아보자
예시
abcd1234
=> $2b$10$/LLAco/JyVf4Eol7sCEzmehQogQFmmSb8cQBBKQfB5elDZ3cCK2ay
이번에 bcrypt가 무엇인지 그 주변 생태계와 bcrypt는 어느 범주에 속해있는지 파악해보자
우선 위키백과를 통해 알아보자
bcypt는 블로피시 암호에 기반을 둔 암호화 해시 함수
로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었다.
- 블로피시(blowfish) : 블로피시(blowfish)는 1993년 브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호이다. 수많은 암호화 제품군에 포함되어 있다. 블로피시는 소프트웨어에서 양호한 암호화 속도를 제공하지만 현재는 고급 암호화 표준이 더 많은 눈길을 끌고 있다.
- 암호화 해시 함수 : 해시 값으로부터 원래의 입력값과의 관계를 찾기 어려운 성질을 가지는 경우를 의미한다.
- 해시 함수 : 해시 함수(hash function) 또는 해시 알고리즘(hash algorithm) 또는 해시함수알고리즘(hash函數algorithm)은 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다.
- 해시함수(hash函數)는 하나의 주어진 출력에 대하여 이 출력으로 사상시키는 하나의 입력을 찾는 것이 계산적으로 불가능하고, 하나의 주어진 입력에 대하여 같은 출력으로 사상시키는 또 다른 입력을 찾는 것이 계산적으로 불가능하다는 두 가지 성질을 만족하면서 임의의 비트열을 고정된 길이의 비트열로 사상시키는 함수이다.
bcrypt 해시 문자열 구성
$2b$[cost]$[22 character salt][31 character hash]
- 2a : 해시 알고리즘 식별자
- cost :
- 키 스트레칭한 횟수. 2^n으로 10이라면 2^10 = 1024(번) 이다
- salt : 솔트(salt)는 데이터, 비밀번호, 통과암호를 해시 처리하는 단방향 함수의 추가 입력으로 사용되는 랜덤 데이터이다.
- 128 비트 솔트, 22자, base64로 인코딩
- hash : salting과 키 스트레칭 후 해시 값
검증
- 비밀번호가 동일한지 검증하기 위해 입력된 비밀번호에 salting, 키 스트레칭을 해서 저장된 bcrypt 문자열과 비교한다
salting과 키 스트레칭
참고