BCrypt
IT 공부 공부
http://java21.net/blog/kang?post_id=2418
BCrypt
✅ Salting & Key Stretching
단방향 암호화에 사용되는 해시 알고리즘은 동일한 평문에 대해 항상 동일 해시값을 갖는다. 따라서 특정 해시 알고리즘에 대하여 특정 평문이 어떤 해시값을 갖는지 알 수 있다.
또한 해시 함수는 본래 신속히 데이터를 검색하기 위해 탄생됐다. 따라서 공격자는 매우 빠른 속도로 임의의 문자열의 해시값과 해킹할 대상의 해시값을 비교하여 대상자를 공격할 수 있다.
이런한 문제를 보안하기 위해 단방향 암호화를 진행할 때 **솔팅(Salting)**과 **키 스트레칭(Key Stretching)**을 적용 시킨다.
✔️ 솔팅(Salting)
솔팅은 단방향 해시 함수 암호화를 진행 할 때 본래 데이터에 추가적으로 랜덤한 데이터를 더하는 방식이다. 원래 데이터에 추가 데이터가 포함 되었기 때문에 이전의 해시값과 달라진다.
✔️ 키 스트레칭(Key Stretching)
단방향 해쉬값을 계산 한 후, 그 해쉬값을 또 다시 해시하고 또 이를 반복하는 방식이다. 최근 일반적인 장비로도 1초에 50억 개 이상의 해시값을 비교할 수 있다. 하지만 키 스트레칭을 적용하면 동일 장비에서 1초에 5번 정도만 비교할 수 있다. GPU(Graphics Processing Unit)를 사용하더라도 수백에서 수천 번 정도만 비교할 수 있다.

[그림5] Salting & Key Stretching
✅ Bcrypt 란?
**Bcypt**는 브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수다. Niels Provos 와 David Mazières가 설계했다. Bcrypt는 **레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용**한 대표적인 예다.
✔️ 구조
$2b$12$76taFAFPE9ydE0ZsuWkIZexWVjLBbTTHWc509/OLI5nM9d5r3fkRG
\/ \/ \____________________/\_____________________________/
Alg Cost Salt Hash
2b: 해시 알고리즘 식별자 ( Alg: 알고리즘 버전 )12: Cost Factor로 Key Stretching의 수 (2의 12승번) ( Cost: 작업 계수 )76taFAFPE9ydE0ZsuWkIZe: 16Byte 크기의 Salt, Base64로 인코딩된 22개의 문자 ( Salt: 16바이트(128비트) 솔트, Base64로 인코딩)xWVjLBbTTHWc509/OLI5nM9d5r3fkRG: 24Byte의 해시 값, Base64로 인코딩된 31개의 문자 ( Hash: 실제 해시 값, Base64로 인코딩 )
✔️ 검증
Bcrypt는 단방향 해시 알고리즘이다. 따라서 복호화가 불가능하다. Bcrypt의 검증은 암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt를 이용한다.
비교하고 싶은 평문을
암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt을 이용해 해시를 진행한 후
암호화된 값과의 비교를 통해 검증을 진행한다.