Bcrypt

이정훈·2024년 7월 2일
0

웹 보안

목록 보기
5/11

Bcrypt란?

Bcrypt는 Niels Provos와 David Mazières가 Blowfish에 기반하여 만든 해싱 함수입니다.
과거에 crypt를 사용했을 때는 초당 4개의 암호만을 해싱 할 수 있었는데 이후 시간이 지나 컴퓨터 성능이 향상되면서 초당 20만개의 암호를 해싱할 수 있게 되자 이에 대한 반응으로 나온 것이 Bcrypt입니다.
Bcrypt는 CPU 집중적인 연산을 필요로 해 레인보우 테이블 공격과 무차별 대입 공격을 느리게 만들었습니다.
눈여겨 볼 특징은 반복 횟수가 있다는 것으로 반복횟수를 늘림으로써 더욱더 공격을 느리게 만들 수 있습니다.
또한 SALT를 사용하는 것이 기본입니다.

Bcrypt 작동 방식

  1. Key Setup 단계
    EksBlowfishSetup 함수를 이용해 비용, 솔트, 그리고 비밀번호를 이용해 eksblowfish의 상태를 초기화 합니다.
    주요 키로부터 일련의 서브키를 유도하는 키 파생 작업을 수행하는데 주요 키는 비밀번호입니다.
    만약 비밀번호가 짧다면 더 긴 비밀번호로 확장하여 사용합니다.
    이를 키 스트레칭이라고 합니다.
    첫 번째 단계는 결과적으로 키 강화를 통해 공격자의 계산 속도를 느리게 합니다.

  2. Operation 단계
    OrhpeanBeholderScryDoubt라는 192비트 값을 ECB 모드에서 eksblowfish을 이용해 64번 암호화합니다.
    이때 이전 단계의 상태를 사용합니다.
    이 단계의 결과값은 Cost와 128비트의 Salt 값이 암호화 루프의 결과와 연결된 것입니다.

Bcrypt 사용시 생각해볼 점

Bcrypt는 CPU 집약적인 작업을 통해 해싱이 되기때문에 고려해야 할 점이 있습니다.
바로 사용자가 해당 작업 시간을 얼마나 기다려 줄 수 있는지에 대한 것입니다.
이를 위해 UX와 관련된 조사를 통해 사용자가 얼마나 기다려 줄 수 있는지를 파악하고 해당 시간 안에 해싱과 이에 관련된 작업이 끝나게 만들어줘야 합니다.
이때 해싱 시간이 적다면 공격자가 쉽게 파악할 수 있기 때문에 사용자가 기다릴 수 있는 시간 내에 충분한 시간을 들여 해싱을 하게 만들어야 합니다.

결국 요점은 Bcrypt를 사용할 때 보안과 사용자의 경험 사이에서 밸런스를 맞춰야 한다는 것입니다.

아래는 NodeJS로 Bcrypt를 사용하는 예제입니다.

const bcrypt = require("bcrypt");
const plainTextPassword1 = "DFGh5546*%^__90";
for (let saltRounds = 10; saltRounds < 21; saltRounds++) {
  console.time(`bcrypt | cost: ${saltRounds}, time to hash`);
  bcrypt.hashSync(plainTextPassword1, saltRounds);
  console.timeEnd(`bcrypt | cost: ${saltRounds}, time to hash`);
}

아래는 위 예제의 실행 결과입니다.

bcrypt | cost: 10, time to hash: 65.683ms
bcrypt | cost: 11, time to hash: 129.227ms
bcrypt | cost: 12, time to hash: 254.624ms
bcrypt | cost: 13, time to hash: 511.969ms
bcrypt | cost: 14, time to hash: 1015.073ms
bcrypt | cost: 15, time to hash: 2043.034ms
bcrypt | cost: 16, time to hash: 4088.721ms
bcrypt | cost: 17, time to hash: 8162.788ms
bcrypt | cost: 18, time to hash: 16315.459ms
bcrypt | cost: 19, time to hash: 32682.622ms
bcrypt | cost: 20, time to hash: 66779.182ms

보안성을 위해 Cost를 늘리면 해싱에 필요한 시간이 증가하게 됩니다.
다른 한 편에서 보면 유저의 패스워드 검증을 위한 시간이 증가하는 것입니다.

profile
기록으로 흔적을 남깁니다.

0개의 댓글

관련 채용 정보