본문 바로가기
STUDY/NodeJS

[7-2] 비밀번호 해싱 및 검증 라이브러리 - bcrypt

by Y.Choi 2023. 12. 13.
728x90
반응형

 

bcrypt는 비밀번호 해시 함수로, 주로 사용자 비밀번호를 안전하게 저장하기 위해 사용된다.

 

 

<공식문서>

bcrypt.js GitHub저장소

bcrypt.js on npm 

 

 

/ 비밀번호 해시 함수
bcrypt는 일반적인 해시 함수와는 다르게 솔트(Salt)와 함께 동작한다. 솔트는 각 비밀번호에 랜덤한 값을 추가하여 해시 결과를 예측하기 어렵게 만든다.

 

/ 솔트(Salt)
각 비밀번호에는 서로 다른 솔트가 적용된다. 이는 같은 비밀번호라도 각각의 해시가 다르게 생성되어, 레인보우 테이블과 같은 사전 공격을 방지한다.

 

/ 안정성
bcrypt는 해시 알고리즘에 대한 여러 라운드를 지원하여, 더 많은 라운드를 사용할수록 해시 함수를 더 많이 반복하게 된다. 이로 인해 비밀번호를 해시하는 데 소요되는 시간이 증가하며, 무차별 대입 공격에 대한 저항력이 증가한다.

 

/ 비밀번호 검증
저장된 해시된 비밀번호와 사용자가 입력한 비밀번호를 비교할 때, bcrypt는 내부적으로 저장된 솔트를 사용하여 입력된 비밀번호를 해시한 다음 저장된 해시와 비교한다.

 

 

728x90

 

 

bcrypt 설치

npm install bcrypt

 

 

비밀번호 해싱

const bcrypt = require('bcrypt');
const saltRounds = 10; // 솔트 생성 횟수 (추가적인 보안 계층)

const plainPassword = 'user_password';

bcrypt.hash(plainPassword, saltRounds, (err, hash) => {
  if (err) {
    console.error('Error during password hashing:', err);
  } else {
    // 해싱된 비밀번호(hash)를 데이터베이스에 저장
    console.log('Hashed Password:', hash);
  }
});

 

- hash 함수는 비밀번호와 salt를 이용하여 비밀번호를 해싱한다.

 

 

비밀번호 검증

const bcrypt = require('bcrypt');

const hashedPasswordFromDatabase = '$2b$10$Tcs2qDv7ibMY./GBoRUMsOpbxd.BKj.HtJWYXffLQgug5ClCbvy7u'; // 예시 해시된 비밀번호
const userEnteredPassword = 'user_password'; // 사용자가 입력한 비밀번호

bcrypt.compare(userEnteredPassword, hashedPasswordFromDatabase, (err, result) => {
  if (err) {
    console.error('Error during password comparison:', err);
  } else {
    if (result) {
      console.log('Password matches!'); // 비밀번호 일치
    } else {
      console.log('Password does not match!'); // 비밀번호 불일치
    }
  }
});

 

- compare 함수를 사용하여 입력된 비밀번호와 저장된 해시된 비밀번호를 비교한다. 

- 결과(result)가 true이면 비밀번호가 일치하고, false이면 불일치다. 

 

 

728x90
반응형