여러분의 bcrypt는 안녕하십니까?


bcrypt는 암호화할 때 주로 사용하는 해싱 함수입니다. 보통은 비밀번호를 저장할 때 bcrypt를 사용해서 해싱하는 경우가 많죠!

우선, 특징부터 살펴볼까요?

bcrypt의 특징

  1. Slow Hashing (느린 해싱)
    • 빠른 해싱 알고리즘(SHA-256, MD5)과 다르게 bcrypt는 의도적으로 연산을 느리게 만듦.
    • 브루트포스 공격(무차별 대입 공격)에 대한 저항성이 높음.
  2. Salt 적용 (랜덤 값 추가)
    • 같은 비밀번호라도 항상 다른 해시값을 생성하여 레인보우 테이블 공격을 방어함.
  3. Cost Factor (작업량 조절 가능)
    • 해시 연산 횟수를 조정할 수 있어서, 시간이 지나면서 보안성을 강화할 수 있음.
  4. Blowfish 기반
    • Blowfish 암호화 알고리즘을 기반으로 만들어졌으며, 보안성이 뛰어남.
  5. C언어 기반의 알고리즘 위와 같은 특징을 가지고 있고, 제가 다루고 싶은 부분은 5번의 ‘C언어 기반의 알고리즘’입니다.

C언어 기반의 알고리즘

  • 원래 bcrypt 알고리즘은 C로 개발됨.
    • bcrypt 자체는 OpenBSD에서 개발된 암호화 해시 알고리즘으로, 초기 구현은 C 언어로 작성됨.
  • 놀랍게도, 많은 시스템(리눅스, 윈도우 등)에서 C 기반 라이브러리를 제공하여 이를 바탕으로 사용하고 있음. | 언어/프레임워크/런타임 | bcrypt 구현 방식 | | ——————— | ————————————- | | Spring Boot (Java) | Java로 직접 구현 (BCryptPasswordEncoder) | | Node.js (bcrypt) | C++ 네이티브 모듈 | | Node.js (bcryptjs) | 순수 JavaScript 구현 | | Python (bcrypt) | C 기반 라이브러리 사용 | | PHP (password_hash) | C 기반 내장 함수 사용 | | Ruby (bcrypt-ruby) | C 기반 확장 라이브러리 사용 | | Go (bcrypt) | 순수 Go언어로 구현 |

뭐가 문제가 되는데요?

  1. 네이티브 언어로 구현되지 않고, 라이브러리를 타 언어로 구사한 경우 언어 특성에 따라 오류가 나기 쉬워요.
    • C++을 사용하는 Node.js의 bcrypt는 타입안정성의 무리가 생겨요. 어쩔 수 없이 any를 사용하게 되는 경우도 있더라구요…! (@types 설치 했습니다 ㅠ)
  2. 인프라에 해당 언어도 설치되어 있어야한다는 점이 있어요.
    • Node.js로 서버를 구동하는 환경에서 bcrypt때문에 C++을 설치한다는 건 리소스 낭비죠?

      어떻게 해야하는데요? (Node.js)

Java와 Go는 순수 언어로 구현되어 있기에 신경 안쓰셔도 됩니다. 다만, node.js에서는 bcryptjs 를 권장합니다.

bcryptjs는 8년전에 만들어두고 아직까지 한번도 라이브러리가 publish 된 적 없지만,,, 1년전에 publish된 bcrypt 보다 안정성이 뛰어난 게 사실인 거 같습니다. (암호화 알고리즘이 자주 이슈가 생겨 업데이트 되는 것도 이상하지 않나요?)

다행히, bcryptbcryptjs 는 똑같은 함수, 똑같은 문법, 똑같은 파라미터를 받습니다.

본인이 bcrypt 를 사용했다 하더라도, 뚝딱 바꿀 수 있습니다😊

import * as bcrypt from 'bcrypt'; // 이거 대신
import * as bcrypt from 'bcryptjs'; // 요렇게만 바꿔도 똑같이 작동해요!
const saltRounds = 10;
const password = "my_secure_password";
bcrypt.hash(password, saltRounds, (err, hash) => {
    if (err) throw err;
    console.log("해싱된 비밀번호:", hash);
    // 비밀번호 검증
    bcrypt.compare(password, hash, (err, result) => {
        if (err) throw err;
        console.log("비밀번호 일치 여부:", result);
    });
});

© 2021. All rights reserved.

Powered by Hydejack v9.2.1