Enjoy Programming

password hash & salt - bcrypt 본문

JavaScript/Node.JS

password hash & salt - bcrypt

LEETAEEON 2021. 6. 9. 15:23

기존 클론코딩시 password의 암호화시 hash와 salt기능을 passport-local-mongoose를 사용했다.

 

이번에는 블로피시 암호에 기반을둔 암호해시 함수인 bycript를 사용해 진행을 해보았는데.

bycript에 대해 잠시 짚고 넘어가본다.

 

bcrypt는 비밀번호 해시 함수로서 Blowfish라는 암호에 기반한다.

bcrypt는 조정할 수 있는 해시 알고리즘을 써서 패스워드를 저장한다. bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤한

salt를 생성하기 때문에 같은 문자열에 대해서 다른 인코드된 결과를 반환한다. but 공통된 점은 매번 길이가 60인

string을 만든다.

bcrypt는 단반향 암호화를 위해 만들어진 해시 함수이다.

 

sha256같은 기존 해시 함수들의 문제는 원래 암호화를 위해 설계된 것이 아니라 짧은 시간에 데이터를

검색하기 위한 자료구조로 설계되었다. 이 때문에 빠른 속도가 장점이지만 취약점의 원인이기도 하다.

그리고 미리 해시 값들을 계산해 놓은 테이블을 가지고 해시 함수 반환 값을 역추적해 원래 정보를 찾아내는 해킹 방법인

rainbow table attack에는 취약하다.

 

그럼 bcrypt를 사용해보자

먼저 npm install bcrypt로 설치를 해주고

내가 사용할 곳에 import 해준다.

필자의 경우 유저가 회원가입시 password를 입력해서 데이터를 전송하면 user 정보가 생성되기 전에 pre 미들웨어로

사용한다.

user 데이터가 save를 하게 되면 해당 user의 password를 hash하고 salt를 5번 거치게 되게 설정하였다.

사용법은 간단하다 매우~

 

그럼 유저가 가입할때 암호화를 해줬다면 로그인시에는 어떻게 같은지 알 수 있을까.

친절하게도 bcrypt는 compare라는 function을 제공한다.

bcrypt.campare를 이용해 해당 유저가 기입한 password를 첫번째 인수로 database의 암호화된 암호를 두번째인수로 넣어주면 

첫번째 인자를 다시 hash와 salt처리해서 나온 결과값이 database의 password와 비교해서 같으면 true

다르면 false를 return한다.

 

이렇게 비교해주면 끝! 간단하다