본문 바로가기
Development/Node.js

bcrypt로 비밀번호 암호화

by 메정 2021. 11. 23.

bcrypt란?

//현업에서 많이 사용하고 있는 패스워드 암호화 알고리즘이라고 함!

1999 년 USENIX 에서 발표한 Blowfish 암호를 기반으로 Niels Provos 와 David Mazières가 설계한 암호 해싱 함수 (단방향 해싱 함수임)

데이터베이스에 비밀번호 저장 시 비밀번호가 보이도록 저장하면 보안성이 떨어짐

→ 비밀번호 암호화를 통해 보안을 강화해야 함. 이때 bcrypt 암호화 해싱 함수 사용

단방향 해싱 함수

image
image

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
})

참고

bcrypt - 위키백과, 우리 모두의 백과사전

비밀번호 안전보관: bcrypt 를 알아보자

NodeJS 패스워드 암호화 - bcrypt

[Node JS] Bcrypt를 이용하여 로그인 정보 암호화하기

bcrypt

댓글