bcrypt - 패스워드 암호화

박재현·2022년 2월 20일
1
post-custom-banner

💬 bcrypt란?

  • Password-hashing function으로 암호를 hashing만 할 수 있는 단반향 메서드
  • 비밀번호를 암호화 하는데만 이용이 가능, 알고리즘을 통해 Hash를 만들수는 있지만
    만들어진 Hash를 다시 비밀번호로 변환할 수는 없다.

즉 암호화만 가능한 방식이기 때문에 암호화된 결과물을 통해 다시 패스워드로
변환해 줄수는 없다.


🔎 bcrypt 구성

  • 예를들어 사용자가 'abcd123' 이라는 패스워드를 사용했다고 가정했을 때 bcrypt를 통해 hash화 된 비밀번호는 다음과 같다.

$ 2b$ 📌 10 📌 $PzmixJm3ND5E6x.📌 dakYDpuDNhIDzvqO84UoaTv/k8s8KZquT3uZ9i

👉 $ 2b$

  • Algorithm 정보

👉 10

  • Algorithm 복잡도(Cost-비용)

👉 PzmixJm3ND5E6x

  • Salt : 원하는 길이만큼 랜덤한 문자열을 통해 암호를 복잡하게 만듦 (base64-encoded)

👉 dakYDpuDNhIDzvqO84UoaTv/k8s8KZquT3uZ9i

  • Hash: 암호화 된 정보 (base64-encoded)

🔎 bcrypt 사용방법

  • 비밀번호를 hashing할 경우 hashSync(비밀번호, salt숫자)를 사용하면 되고
    이를 검사할 때는 compareSync(비밀번호, hashing된 비밀번호) 를 사용하면 된다.

  • 정상적인 비밀번호인 경우 true 값을 반환한다 ( 비밀번호 틀렸을 시 false)

사용예제

const bcrypt = require('bcrypt');

const password = 'abcd1234';

// 암호화
const hashed = bcrypt.hashSync(password, 10);
console.log(`password: ${password}, hashed: ${hashed}`)
// password: abc1234
// hashed: $2b$10$PzmixJm3ND5E6x.dakYDpuDNhIDzvqO84UoaTv/k8s8KZquT3uZ9i

// check
const result = bcrypt.compareSync('abcd1234', hashed)
console.log(result)
// true

(Server 코드 작성시에는 hash, compare를 통해 비동기적으로 작성)

📣 복잡도가 증가할수록 hash하는데 걸리는 시간이 기하급수적으로 늘어나기 때문에 일반적으로 10 ~ 12가 추천됨

참조: https://auth0.com/blog/hashing-in-action-understanding-bcrypt/


🔐 공부하면서 bcrypt 외에도 SHA-2(Secure Hash Algorithm 2), PBKDF2(Password-Based Key Derivation Function), Scrypt 등의 암호화 function이 존재한 다는 것을 알게 되었다.

향 후 암호화 종류와 쓰임새에 대해 더 공부해봐야 겠다.

post-custom-banner

0개의 댓글