<목차>
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 |