Seongwon Lim

[node.js] Bcrypt를 이용한 패스워드 암호화 본문

Node.js

[node.js] Bcrypt를 이용한 패스워드 암호화

limsw 2022. 5. 10. 14:17
반응형

암호화를 해야하는 이유?

  • 데이터베이스에 비밀번호 정보가 그대로 들어가게 되면 심각한 보안 문제가 발생할 수 있다.
  • 다른 사용자는 물론이고 관리자 또한 사용자들의 비밀번호 정보를 알 수 없게 해야 한다.

What is Bcrypt?

위키에 따르면 bcypt는 블로피시 암호에 기반을 둔 암호화 해시 함수이다. 솔트를 통합한 bcrypt는 적응형 함수의 하나이며 시간이 지남에 따라 속도 저하를 위해 반복 횟수가 증가가 수반될 수 있으므로 연산 파워의 증가에도 브루트 포스 검색 공격에 대한 저항을 유지할 수 있도록 설계된 암호화 기술이다.

 

기존에 사용하던 SHA512, SHA256 해싱 함수와는 다르게 Salt 라는 개념을 도입하여 해싱을 하기 때문에 더 강력한 암호화를 할 수 있다고 평가받고 있다.

What is Salt in bcrypt?

salt는 직역하면 소금을 뿌리는 것이다. 다시 말하면 원래 문자열에 소금을 뿌려서(=salt를 붙여서) 새로운 문자열을 만든다는 의미이다. 사용자는 생성할 salt 개수를 직접 정할 수 있으며 기본적으로 10개를 사용한다고 한다.

How to install bcrypt

  • npm install bcrypt —-save

Bcrypt Example

예를 들어 qwer1234e 라는 문자열을 패스워드로 하는 값을 암호화 하기 위해서는 아래와 같이 입력하면 된다.

const bcrypt = require('bcrypt'); // import module
const saltRoundsh = 10; // 몇개의 salt를 생성할 지 정의

// 비밀번호 암호화 기능
bcrypt.genSalt(saltRounds, (err, salt)=>{
  if(err) return next(err); // error occur

  // 에러가 발생하지 않으면 hash 생성
  bcrypt.hash("qwer1234e", salt, (err, hash) => {
    if(err) return next(err); // hash 생성 오류
    console.log(hash);
  })
})

// 결과 : $2b$10$yciLkIZZMK6FaFOqE.1WR.STQRuRMUGMpsH5//FrcrSx4DP7.vGA6

암호화 문자열과 원래 문자열 비교 방법

bcrypt에서 제공하는 compare 또는 compareSync 메서드를 통해서 암호화된 문자열과 사용자가 입력한 패스워드 문자열을 비교할 수 있다.

const pw = 'qwer1234e';
const encodedPW = '$2b$10$yciLkIZZMK6FaFOqE.1WR.STQRuRMUGMpsH5//FrcrSx4DP7.vGA6';
bcrypt.compare(pw, encodedPW, (err, same) => {
  // async callback you want..
})

Salt 개수를 늘리면 강력한 암호화 패턴을 생성할 수 있지만 성능적인 측면에서 단점이 생기기 때문에 개수를 적절하게 정하는 것도 중요하다.


출처

Comments