비밀번호를 암호화 하는 이유는
전달 받은 비밀번호 문자열을 그대로 DB에 넣으면
외부자의 해킹이나 내부자의 유출에 위험하기 때문이다.
bcrypt는 블로피시 암호에 기반을 둔 암호 해시 함수로서 Niels Provos와 David Mazières가 설계하였으며 1999년 USENIX에서 발표되었다. 레인보우 테이블 공격 방지를 위해 솔트를 통합한 bcrypt는 적응형 함수의 하나이다.
bcrypt는 전달받은 비밀번호에 무작위 문자열인 Salt를 붙여 암호화한다.
이유는 Salt를 붙이지 않으면 전달받은 비밀번호의 문자열이 같으면 항상 같은 해쉬값이 나오기 때문이다.
그렇게 되면 해킹에 취약해질 수 있으므로 Salt를 붙이는게 보안상 유리하다.
=> bcrypt 해쉬 문자열의 예
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
Alg Cost Salt Hash
Alg : 알고리즘 식별자
Cost : Cost factor, 10 => 2^10 rounds
Salt : 붙여진 Salt를 명시 => byte type
Hash : 해쉬함수에 넣은 결과값 (암호화된 결과) => byte type
pip install bcrypt
import bcrypt
password = "1234"
encoded_password = password.encode('utf-8')
hashed_password = bcrypt.hashpw(encoded_password, bcrypt.gensalt())
new_password = "1234"
encoded_new_password = new_password.encode('utf-8')
bcrypt.checkpw(encoded_new_password, encoded_password) # 일치하면 True 가 반환된다.
비밀번호 암호화는 '단방향'이기 때문에 암호화된 비밀번호를 복호화 할 수 없다.
따라서 로그인 인증을 할 때에 새로 입력받은 비밀번호를 같은 방법으로 해쉬해서 옳은 비밀번호인지 확인한다.