본문 바로가기
Node.js

bcrypt - 암호 해시 함수

by _sweep 2021. 5. 8.

따라하며 배우는 노드, 리액트 기본 강의를 듣고 정리한 내용입니다.

 

bcrypt란?

블로피시 암호에 기반을 둔 암호 해시 함수로서 레인보 테이블 공격 방지를 위해 salt를 통합한 적응형 함수의 하나이다.

라고 위키피디아에 적혀있긴 하지만 개인적으로 조금 어려운 설명이 아닐까 싶다.

 

bcrypt로 무엇을 할 수 있는가 하면 보안을 좀 더 강화하는 용도로 쓰일 수 있다.

client에서 DB내에 저장할 데이터들을 받을 때 비밀번호와 같이 암호화가 필요한 부분이 있다.

이런 경우 bcrypt를 통해 hash function을 사용하고 hash된 암호를 저장함으로써 보안을 강화할 수 있다.

 

bcrypt 설치

 

bcrypt는 다음의 명령어를 터미널에 입력해 설치할 수 있다.

 

npm install bcrypt --save

 

bcrypt 사용

bcrypt를 사용하기 위해서는 다음의 선언부가 필요하다.

 

const bcrypt = require('bcrypt');
const saltRounds = 10;

 

아래는 npm > bcrypt에서 제공하는 코드이다.

 

// Technique 1

bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
        // Store hash in your password DB.
    });
});


// Technique 2

bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
    // Store hash in your password DB.
});

먼저 Technique1을 살펴보자면 bcrypt.genSalt(saltRound, cb function) 메소드를 통해 salt를 생성한다.

이후 생성된 salt값을 cb function의 인자로 넘기고

bcrypt.hash(password, salt, cb function) 메소드를 통해 password를 hashing 한다.

hashing된 password는 cb function을 통해 hash에 저장된다.

이 값을 원래 password가 들어가야 했던 곳으로 대신 넣어주면 hashing된 password가 저장된다.

 

Technique2는 Technique1의 간략화된 버전이라고 볼 수 있다.

bcrypt.hash 메소드에 salt대신 saltRounds를 넣음으로써 salt의 생성과 hashing을 동시에 할 수 있다.

 

결과

 

위 사진은 bcrypt를 사용해 hashing된 password를 mongoDB에 저장한 결과이다.

단순히 유저가 입력한 password가 아닌 암호화된 값이 password 칸에 들어간 것을 볼 수 있다.

 

해시 문자열은 $2b$[cost]$[22 character salt][31 character hash] 로 이루어 지는데,

위의 해시 문자열을 분석해보자면 다음과 같이 나눌 수 있다.

 

$2b$10$LHb7dnygr1zK80XeSYboYuLCbPbewbdbLZ4SkXLHa0sZ5T7eyhMnC

 

$2b$ 해시 알고리즘 식별자
10 Cost factor (2^10 = 1,024 rounds)
LHb7dnygr1zK80XeSYboYuL 16바이트(128비트) salt
CbPbewbdbLZ4SkXLHa0sZ5T7eyhMnC 24바이트(192비트) 해시값

 

 

bcrypt에 대한 더 자세한 내용은 아래 페이지에서 확인할 수 있다.

https://www.npmjs.com/package/bcrypt

 

bcrypt

A bcrypt library for NodeJS.

www.npmjs.com

 

댓글