일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- java
- JavaScript
- https
- JWT
- it
- 타입스크립트
- elb
- 조건문
- CORS
- npm
- mongodb
- Load Balancer
- 항해99
- 노마드코더
- wil
- mongoose
- 생활코딩
- 메소드
- TypeScript
- Node.js
- nginx
- Nodejs
- reduce
- 프로그래머스
- MYSQL
- Joi
- nomadcoder
- ubuntu
- AWS
- 자바스크립트
- Today
- Total
V-logue
[Node.js] bcrpyt 모듈, 본문
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가 시간이 지남에 따라, 반복 횟수를 늘려 더 느리게 만들 수 있으므로
계산 능력이 증가하더라도 무차별 대입 검색 공격에 저항력을 유지하는 장점이 있다.
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://juni-official.tistory.com/161
'발자취 > Node.js' 카테고리의 다른 글
[Node.js] Kakao 소셜로그인 구현 (0) | 2022.06.21 |
---|---|
[Node.js] Express.multer, Multer-S3 (0) | 2022.06.13 |
[Node.js] Express.joi 모듈을 활용해 validation을 검증하자 (0) | 2022.06.09 |
[Node.js] Express.cors (0) | 2022.06.09 |
[Node.js] JavaScript에서 Morgan과 Winston을 사용해 ExpressJS를 위한 더 나은 logs system (0) | 2022.06.08 |