본문 바로가기
Node.js

Node.js - bcrypt

by J-non 2024. 7. 11.

<목차>

1. bcrypt란?

2. bcrypt 사용법

 


 

1. bcrypt란?

Bcrypt는 브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수다.

Bcrypt는 레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한 대표적인 예다.

 

 

Salting & Key Stretching

단방향 암호화에 사용되는 해시 알고리즘은 동일한 문자에 대해 항상 동일 해시값을 갖는다. 따라서 특정 해시 알고리즘에 대하여 특정 문자가 어떤 해시값을 갖는지 알 수 있다.

또한, 해시 함수는 본래 신속히 데이터를 검색하기 위해 탄생되었기 때문에 공격자는 매우 빠른 속도로 임의의 문자열의 해시값과 해킹할 대상의 해시값을 비교하여 대상자를 공격할 수 있다.

이러한 문제를 보안하기 위해 단방향 암호화를 진행할 때 솔팅(Salting)과 키 스트레칭(Key Stretching)을 적용 시킨다.

 

솔팅(Salting)

솔팅은 단방향 해시 함수 암호화를 진행 할 때 본래 데이터에 추가적으로 랜덤한 데이터를 더하는 방식이다. 원래 데이터에 추가 데이터가 포함 되었기 때문에 이전의 해시값과 달라진다.

 

키 스트레칭(Key Stretching)

단방향 해쉬값을 계산 한 후, 그 해쉬값을 또 다시 해시하고 또 이를 반복하는 방식이다.

최근 일반적인 장비로도 1초에 50억 개 이상의 해시값을 비교할 수 있다고 한다. 하지만 키 스트레칭을 적용하면 동일 장비에서 1초에 5번 정도만 비교할 수 있다고 하며, GPU(Graphics Processing Unit)를 사용하더라도 수백에서 수천 번 정도만 비교할 수 있어 보안성이 올라가게 된다.

 

 

구조

bcrypt 해시 문자열은 다음과 같은 형태로 구성된다.

$2b$[cost]$[22 character salt][31 character hash]

 

예시)

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\/ \/ \_____________________/\_____________________________/
Alg Cost 	Salt 			Hash

 

  • 2a : 해시 알고리즘 식별자 (bcrypt)
  • 10 : Cost Factor로 Key Stretching의 수 (2의 10승번)
  • N9qo8uLOickgx2ZMRZoMye : 16바이트(128비트) 솔트, Base64로 인코딩된 22개의 문자
  • IjZAgcfl7p92ldGxad68LJZdL17lhWy : 24바이트(192비트) 해시, Base64로 인코딩된 31개의 문자

 

2. bcrypt 사용법

NodeJS 환경에서 bcrypt를 사용해보자

bcrypt는 외부 모듈이기 때문에 npm을 통해 설치 후 사용할 수 있다.

npm i bcrypt

 

 

bcrypt를 통한 암호화(해시화)

const bcrypt = require("bcrypt");

const createHash = () => {
    return new Promise((res, rej) => {
        bcrypt.hash("암호화할 데이터", Key Stretching반복 횟수, (err, result) => {
            if (err) rej("해싱 실패");
            res(result);
        });
    });
}

 

 

 

bcrypt를 통한 검증

const compare = (pw, hash) => {
    return new Promise((res, rej) => {
        bcrypt.compare("암호화할 데이터", "암호화한 데이터" (err, result) => {
          if (err) rej("비밀번호가 일치하지 않습니다.");
          res(result);
        });
    });
}

 

'Node.js' 카테고리의 다른 글

Node.js - ORM, sequelize  (0) 2024.08.20
Node.js - jwt(Json Web Token)  (0) 2024.08.19
Node.js - MySQL 연결하기  (0) 2024.07.01
Node.js - ejs  (0) 2024.06.30
Node.js - REST란?  (0) 2024.06.29