V-logue

[Node.js] bcrpyt 모듈, 본문

발자취/Node.js

[Node.js] bcrpyt 모듈,

보그 2022. 6. 9. 03:40

Bcrpyt, 

bcrypt.hashpw(password, bcrypt.gensalt())

bcrpyt는 암호를 해시화 하는데, 도움이되는 라이브러리다.

1999년 USENIX에서 발표된 ..... 암호 해싱 기능이다.

비밀번호 해싱(Password hashing)이란?
유저가 클라이언트에서 입력한 정보가 db에 저장되는데,
비밀번호와 같은 정보는 아주 민감하고 안전하게 다뤄줘야 한다.
만약 유저가 1q2w3e4r이라는 Plain Text를 입력하고, 이대로 Plain Text가 db에 저장된다면
서버 관리자가 알 수 있음은 물론이고
해커마저도 쉽게 알아낼 수 있을 것이다. 바로 이럴때에, 필요한 것이 해싱인데
해싱은 위의 Plain Text를 특정적인 해시화하는 무언가를 사용해
잘게 쪼개고 어렵게 인간이 해독하지 못하게 암호화시키는 것을 의미한다.
해싱은 단방향적인 특징을 가지고 있기 때문에, Plain Text를 Hashed Text로 바꾸는 것은 가능하지만
반대로 Hashed Text를 Plain Text로 바꾸는 것은 불가능하다.

password를 암호화 하는데는 SHA-2, PBKDF2 등이 있지만 bcrpyt를 추천하고들 하는데,

그 이유는 limit이 없는 연산 능력을 가진 암호에 대한 공격자가 모든 종류의 알고리즘을 해독할 수 있겠지만, 이는 이론에 기반한 것이지 실제로는 무척이나 어려운 일이다. 실제의 공격자는 컴퓨터의 자원을 무제한적으로 보유하고 공격할 수 없기 때문에 bcrpyt가 시간이 지남에 따라, 반복 횟수를 늘려 더 느리게 만들 수 있으므로

계산 능력이 증가하더라도 무차별 대입 검색 공격에 저항력을 유지하는 장점이 있다.

https://velog.io/@kylexid/%EC%99%9C-bcrypt-%EC%95%94%ED%98%B8%ED%99%94-%EB%B0%A9%EC%8B%9D%EC%9D%B4-%EC%B6%94%EC%B2%9C%EB%90%98%EC%96%B4%EC%A7%88%EA%B9%8C

bcrypt는 단방향 해시 함수를 이용한 모듈로써 Salt 라는 개념을 사용하는데, Salt 라는 값은 아주 작은 단위의 값으로

음식에 소금을 추가적으로 친다는 의미로 사용된다고 한다(정말로 찾아보니 그렇다).

비밀번호에 Salt라는 임의의 값을 추가해서 hashing하면 Salt를 추가하기 전과 완전히 다른

새로운 Hashed Text가 생성되기 때문에 Rainbow table Attack이 어려워 진다.

 

bcrpyt는 암호화 구현 시 문자열의 처음 72 bytes만 사용된다. 암호를 match시킬 때, 추가적인 bytes는 무시된다.

주의할 점은, 처음의 72 bytes가 아니라는 점이다.

bcrypt는 비밀번호(최대 72바이트)와 솔트(관련 반복 횟수 포함)이며 산출 24바이트 해시이다.

 

npm install bcrypt

먼저, bcrypt를 install하고

 

비밀번호를 암호화한다.

const bcrypt = require('bcrypt');
const saltRounds = 10;
const myPlaintextPassword = 's0/\/\P4$$w0rD';
const someOtherPlaintextPassword = 'not_bacon';

 

그 다음 비밀번호를 검증해야 하는데, 다음과 같다.

const PW = 'abcd1234';
const encryptedPW = bcrypt.hashSync(PW, 10);

bcrypt.compare(PW , encryptedPW, (err, same) => {
  console.log(same);  //=> true
})

//------------------------------------------------

const PW = 'abcd1234';
const encryptedPW = bcrypt.hashSync(PW, 10);

const same = bcrypt.compareSync(PW, encryptedPW);
console.log(same); // same = true

// hash는 동기, hashSync는 비동기 방식 파라미터로 넣은 숫자 10은 암호화에 사용되는 Salt로,
// 값이 높을수록 암호화 연산이 증가. 하지만 암호화하는데 속도가 느려짐.

회원이 로그인할 때 입력한 비밀번호는 compare를 통하여 검증한 후 로그인을 성공시키면 끝.

위 코드 중 비동기방식을 console.log로 찍어보면,

위 사진과 같이 잘 암호화가 이루어진 모습을 볼 수 있다.

+

최근 진행중인 프로젝트에서 써봤더니,

이렇게 몽고db에도 비밀번호가 도저히 내가 알아볼 수 없게 변했다.

직접 써보니 의미가 있다는 생각이 든 순간이었다.

참조

https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-bcrypt-%EB%AA%A8%EB%93%88-%EC%9B%90%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%B2%95#%EC%99%9C-bcrypt%EA%B0%80-%EC%B6%94%EC%B2%9C%EB%90%98%EC%96%B4%EC%A7%88%EA%B9%8C

 

[NODE] 📚 bcrypt 모듈 (원리 & 사용법)

암호화 종류 SHA-2(Secure Hash Algorithm 2) 미국 NSA에서 설계한 암호화 해시 함수. digest size는 224, 256, 512 bit로 해시함수로 구성되어졌음. GPU를 이용한 연산속도가 매우 빠르기 때문에 password 암호..

inpa.tistory.com

https://juni-official.tistory.com/161

 

[Node.js] Bcrypt로 사용자 비밀번호 암호화하기

Node.js - Bcrypt 사용하기 Bcrypt는 레인보우 테이블 공격 방지를 위해 솔트(Salt)를 통합한 적응형 함수 중 하나라고 한다. SHA 종류의 암호화는 GPU 연산에 유리한 32비트 논리 및 연산만 사용하기 때문

juni-official.tistory.com

 

 

 

 

 

Comments