bcrypt란?
//현업에서 많이 사용하고 있는 패스워드 암호화 알고리즘이라고 함!
1999 년 USENIX 에서 발표한 Blowfish 암호를 기반으로 Niels Provos 와 David Mazières가 설계한 암호 해싱 함수 (단방향 해싱 함수임)
데이터베이스에 비밀번호 저장 시 비밀번호가 보이도록 저장하면 보안성이 떨어짐
→ 비밀번호 암호화를 통해 보안을 강화해야 함. 이때 bcrypt 암호화 해싱 함수 사용
단방향 해싱 함수
bcrypt 해시 문자열의 형태
$2b$[cost]$[22 character salt][31 character hash]
ex)
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
\__/\/ \____________________/\_____________________________/
Alg Cost Salt Hash
$2a
: 해시 알고리즘 식별자 (bcrypt) (버전 정보)$10
: Cost factor (2 ==> 1,024 rounds) (연산량, 소요시간)// cost 의 값이 클수록연산의 cost가 증가 ex. cost = 10 → 2^10번 돌린 것
N9qo8uLOickgx2ZMRZoMye
: 16바이트(128비트) 솔트, base64-encoded to 22 characters// cost의 정보를 통해 생성된 salt
IjZAgcfl7p92ldGxad68LJZdL17lhWy
: 24바이트(192비트) 해시, base64-encoded to 31 characters// hash 값 (암호문)
사용 방법
✔️ 는 내가 구현 시 사용한 방법
1.Bcrypt 모듈 설치
```bash
npm install bcrypt --save
```
2.bcrypt 모듈을 임포트
```jsx
const bcrypt = require('bcrypt')
```
3.hasing 함수 사용하여 비밀번호 암호화
- 방법 1 (비동기 방식으로 콜백을 처리)
```jsx
bcrypt.genSalt(saltRounds, function(err, salt) {
bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
// Store hash in your password DB.
});
});
```
- `genSalt(saltRounds, callback)` : salt 값 생성. 생성된 salt값은 callback메서드의 인자로 넘김
- `bcrypt.hash(myPlaintextPassword, salt, callback)` : salt값, password값을 callback 메서드를 통해 암호화된 Text(hash)로 반환해줌
- **salt 값**은 높을수록 암호화가 강력해지지만 속도는 느려짐 **(기본 10 설정)**
✔️ 방법 2 (동기 방식으로 콜백을 처리)
const password = '1234' const encryptedPassowrd = bcrypt.hashSync(password, 10) // sync
hashSync(plainTextpassword, salt)
: salt값을 이용하여 원래 비밀번호를 암호화된 Text(hash)로 반환
비밀번호 비교하기
✔️ 는 내가 구현 시 사용한 방법
입력 받은 값과 데이터베이스에 암호화하여 저장한 값을 비교하는 방법
✔️ 방법 1 (비동기 방식으로 콜백 처리)
const password = '1234'
const encodedPassword = '$2a$10$tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
const same = bcrypt.compareSync(password, encodedPassword) // sync
방법 2 (동기방식으로 콜백 처리)
const password = '1234'
const encodedPassword = '$2a$10$tUUfk1E0jGr90ntHxl/wE.lzrVvAQfxJ7nRo3RYXi2XqJtlv2h.UW'
bcrypt.compare(password, encodedPassword, (err, same) => {
// async callback
})
참고
'Development > Node.js' 카테고리의 다른 글
Express, mysql2 코드 모듈화하기 (with 트랜잭션) (0) | 2022.08.18 |
---|---|
CodeDeploy 이해하고 푸쉬 서버와 API 서버 분리하기 (0) | 2022.08.18 |
슬랙에서 서버 에러 알림 받고 유연하게 에러 대응하기 (0) | 2022.08.18 |
[에러 해결] Error: No default engine was specified and no extension was provided (0) | 2021.11.23 |
Nodejs Webpack으로 빌드하는 과정에서 발생한 에러(ERROR in ./node_modules/@mapbox/node-pre-gyp/lib/util/s3_setup.js) (0) | 2021.11.23 |
댓글