BCrypt
1. 개요
1. 개요
BCrypt는 1999년 Niels Provos와 David Mazières가 OpenBSD를 위해 개발한 암호 해시 함수이다. 이 함수는 블로피시 암호를 기반으로 설계되어, 비밀번호와 같은 민감한 데이터를 안전하게 저장하기 위한 목적으로 만들어졌다.
기존의 MD5나 SHA-1과 같은 빠른 해시 함수와 달리, BCrypt는 의도적으로 속도를 늦추고 자원 소모를 크게 만들어 무차별 대입 공격을 어렵게 한다. 이는 키 길이를 128비트에서 448비트까지 조절할 수 있고, 라운드 수를 가변적으로 설정할 수 있기 때문에 가능하다. 기본 라운드 수는 10이다.
주요 목적은 사용자의 평문 비밀번호를 복원 불가능한 해시 값으로 변환하여 저장하는 것이다. 이렇게 하면 데이터베이스가 유출되더라도 원본 비밀번호를 쉽게 알아낼 수 없어 보안성을 크게 향상시킨다. 현재까지도 비밀번호 저장을 위한 사실상의 표준 알고리즘 중 하나로 널리 사용되고 있다.
2. 작동 원리
2. 작동 원리
BCrypt는 1999년 Niels Provos와 David Mazières가 OpenBSD를 위해 개발한 암호 해시 함수이다. 이 함수는 블로피시(Blowfish) 대칭 키 블록 암호 알고리즘을 기반으로 하여, 특히 비밀번호 저장에 적합하도록 설계되었다. 핵심 작동 원리는 비밀번호를 단순히 해시하는 것을 넘어, 의도적으로 계산 비용을 높이고 무차별 대입 공격을 어렵게 만드는 데 있다.
BCrypt의 작동 과정은 크게 솔트 생성과 키 스케줄링, 그리고 반복적인 암호화 라운드로 구성된다. 먼저 시스템은 임의의 솔트를 생성하여 비밀번호와 결합한다. 이후 블로피시 알고리즘의 키 스케줄링 과정을 활용하는데, 이 과정은 표준 블로피시보다 훨씬 많은 계산 자원을 소모하도록 변형되었다. 이 변형된 키 스케줄링은 입력된 비밀번호와 솔트를 사용하여 내부 상태를 초기화하는 역할을 한다.
초기화 후, 미리 정의된 64비트 상수 데이터("OrpheanBeholderScryDoubt")를 반복적으로 암호화한다. 이때 라운드 수는 워크 팩터(Work Factor)에 의해 결정되며, 기본값은 10이다. 워크 팩터가 1 증가할 때마다 필요한 해시 계산 시간은 약 2배씩 기하급수적으로 늘어난다. 최종 출력은 알고리즘 버전, 워크 팩터, 솔트, 그리고 암호화 결과를 모두 포함하는 단일 문자열 형식으로 결합된다.
이러한 설계로 인해 BCrypt 해시는 표준적인 형식을 가지며, 결과 문자열 자체에 알고리즘 식별자, 솔트, 워크 팩터 정보가 모두 포함되어 있다. 이는 해시를 검증할 때 별도의 메타데이터 저장 없이도 동일한 파라미터를 사용하여 원본 비밀번호를 비교할 수 있게 해준다.
3. 주요 특징
3. 주요 특징
3.1. 솔트(Salt)
3.1. 솔트(Salt)
BCrypt에서 솔트는 암호 해시의 보안을 강화하기 위해 사용되는 임의의 데이터 조각이다. 솔트는 암호에 추가된 후 함께 해싱되며, 이 과정을 솔팅이라고 한다. 솔트의 주요 목적은 레인보우 테이블 공격을 방지하는 것이다. 레인보우 테이블은 미리 계산된 해시값들의 거대한 목록인데, 솔트가 없으면 동일한 암호는 항상 동일한 해시값을 생성하기 때문에 이 공격에 취약해진다. 솔트를 사용하면 동일한 암호라도 서로 다른 솔트값과 결합되어 전혀 다른 해시값을 생성하게 되어, 공격자가 미리 계산된 테이블을 무용지물로 만든다.
BCrypt는 각 암호에 대해 고유하고 암호학적으로 안전한 난수 생성기(CSPRNG)로 생성된 솔트를 자동으로 생성한다. 이 솔트는 해시 결과에 함께 저장되므로, 암호를 검증할 때는 저장된 해시에서 솔트를 추출하여 입력받은 암호와 다시 결합하고 해싱한 후 결과를 비교한다. 이 방식 덕분에 시스템은 솔트를 별도로 관리할 필요 없이 해시 문자열 자체만 저장하면 된다.
솔트의 일반적인 구현 특성은 다음과 같다.
특성 | 설명 |
|---|---|
길이 | 일반적으로 128비트(16바이트)이다. |
생성 | 암호학적으로 안전한 난수 생성기로 각 암호마다 독립적으로 생성된다. |
저장 | 최종 해시 문자열(예: |
목적 | 레인보우 테이블 공격을 무력화하고, 동일 암호의 해시값이 달라지게 한다. |
결과적으로, 솔트는 암호 저장의 기본적인 보안 요구사항이 되었다. BCrypt를 포함한 현대적인 암호 해시 함수는 솔트 생성과 관리를 자체적으로 처리하여 개발자가 안전하게 구현할 수 있도록 설계되었다.
3.2. 워크 팩터(Work Factor)
3.2. 워크 팩터(Work Factor)
워크 팩터는 BCrypt의 핵심 보안 매개변수로, 해시를 생성하는 데 필요한 계산 비용을 결정한다. 이 값은 라운드 수를 의미하며, 일반적으로 4에서 31 사이의 정수로 표현된다. 기본값은 10이다. 이 숫자가 높을수록 해시를 계산하는 데 필요한 시간과 자원이 기하급수적으로 증가한다.
워크 팩터의 주요 목적은 무차별 대입 공격에 대한 저항력을 시간이 지남에 따라 조정 가능하게 만드는 것이다. 하드웨어 성능이 향상되면 워크 팩터 값을 높여서, 예를 들어 10에서 12로 증가시키면, 해시 생성 시간이 약 4배 늘어난다. 이는 공격자가 같은 시간 동안 시도할 수 있는 패스워드 후보의 수를 크게 줄여준다.
주요 특징 | 설명 |
|---|---|
표현 방식 |
|
영향 범위 | 해싱 시간과 필요 연산량을 결정 |
조정 가능성 | 애플리케이션 요구사항과 하드웨어 성능에 따라 유연하게 설정 가능 |
이 적응형 특성 덕분에 BCrypt는 1999년 출시 이후에도 오랜 기간 동안 패스워드 저장에 권장되는 함수로 남아 있다. 시스템 관리자는 보안 요구사항과 서버 부하를 고려하여 적절한 워크 팩터 값을 선택해야 한다.
3.3. 적응형 해시 함수
3.3. 적응형 해시 함수
BCrypt는 적응형 해시 함수의 대표적인 예시이다. 이는 시간이 지남에 따라 컴퓨팅 성능이 향상되더라도, 암호 해시의 보안 강도를 유지할 수 있도록 설계된 핵심 메커니즘이다. 적응성은 주로 워크 팩터라는 매개변수를 통해 구현된다. 시스템 관리자는 이 워크 팩터 값을 조정하여 단일 해시를 생성하는 데 필요한 계산 비용(주로 CPU 사이클 또는 메모리 사용량)을 증가시킬 수 있다. 따라서 하드웨어 성능이 발전하면, 워크 팩터를 높여 해시 생성 시간을 의도적으로 늘림으로써 무차별 대입 공격에 대한 저항력을 유지한다.
BCrypt의 적응성은 그 기반 알고리즘인 블로피시 암호의 구조에서 비롯된다. BCrypt는 블로피시의 키 스케줄링 과정을 반복적으로 사용하여 해시를 생성하는데, 이때 워크 팩터는 키 스케줄링을 수행하는 라운드 수를 결정한다. 예를 들어, 워크 팩터가 12라면 키 설정 과정이 2^12(4096)회 반복된다. 이 반복 횟수를 기하급수적으로 증가시키면 해시 계산에 필요한 시간도 크게 늘어나, 공격자가 대량의 암호 후보를 검사하는 것을 현실적으로 불가능하게 만든다.
이 방식의 주요 장점은 미래 보안에 대한 대비가 가능하다는 점이다. 1999년 처음 출시된 당시 적절했던 워크 팩터 설정은 오늘날의 고성능 하드웨어에서는 충분하지 않을 수 있다. 그러나 BCrypt를 사용하는 시스템은 설정값만 업데이트하면 기존 데이터 구조나 알고리즘의 변경 없이도 새로운 보안 표준에 맞춰 강도를 높일 수 있다. 이는 OpenBSD와 같은 보안 중심 시스템에서 BCrypt를 채택한 중요한 이유 중 하나이다.
특징 | 설명 |
|---|---|
적응 메커니즘 | 워크 팩터(라운드 수) 조정 |
목적 | 컴퓨팅 성능 발전에 따른 보안 강도 유지 |
효과 | 무차별 대입 공격 비용 기하급수적 증가 |
기반 기술 | 블로피시 암호의 반복적 키 스케줄링 활용 |
4. 사용 사례
4. 사용 사례
BCrypt는 비밀번호 저장에 특화된 해시 함수로, 주로 웹 애플리케이션과 시스템의 사용자 인증 정보를 안전하게 보호하는 데 사용된다. 기본적으로 느린 해시 속도와 적응형 워크 팩터를 통해 무차별 대입 공격에 강한 것이 특징이다.
주요 사용 사례로는 웹 서비스의 사용자 비밀번호 해싱이 가장 대표적이다. 많은 현대의 웹 프레임워크와 애플리케이션(예: Spring Security, Passport.js, Laravel 등)에서 기본 또는 권장 비밀번호 해시 알고리즘으로 채택하고 있다. 또한, OpenBSD 운영체제를 비롯한 여러 유닉스 계열 시스템에서도 시스템 비밀번호를 저장하는 데 사용된다.
사용 분야 | 구체적 예시 |
|---|---|
웹 애플리케이션 | 회원 가입/로그인 시 비밀번호 암호화 저장 |
운영체제 | OpenBSD 등의 시스템 사용자 계정 비밀번호 저장 |
데이터베이스 | 애플리케이션 DB 내 해시된 비밀번호 필드 |
이 알고리즘은 1999년 Niels Provos와 David Mazières에 의해 개발되어 오랜 기간 검증을 받았으며, 기반 알고리즘인 블로피시 암호를 사용한다. 시간이 지남에 따라 컴퓨팅 성능이 향상되더라도 워크 팩터를 조정하여 해시 생성 비용을 높일 수 있어, 미래에도 안전성을 유지할 수 있는 전략을 제공한다는 점에서 장기적인 사용에 적합하다.
5. 안전성과 고려사항
5. 안전성과 고려사항
BCrypt는 1999년 Niels Provos와 David Mazières가 OpenBSD를 위해 개발한 암호 해시 함수이다. 이 알고리즘은 블로피시 암호를 기반으로 하며, 설계 단계부터 느린 해시 계산과 키 설정 비용을 높이는 데 중점을 두었다. 이는 무차별 대입 공격이나 레인보우 테이블 공격에 대한 비용을 극적으로 증가시켜 실질적인 방어를 가능하게 한다.
안전성의 핵심은 적응형 특성에 있다. BCrypt의 라운드 수(워크 팩터)는 시간이 지남에 따라 하드웨어 성능이 향상되더라도 조정될 수 있다. 예를 들어, 기본 라운드 수가 10이었다면 컴퓨팅 파워가 증가하면 12나 그 이상으로 높여 공격에 필요한 시간과 자원을 일정 수준으로 유지할 수 있다. 또한, 각 암호 해시에 임의로 생성되는 솔트는 동일한 암호라도 전혀 다른 해시 값을 생성하게 하여 사전 공격을 무효화한다.
사용 시 고려해야 할 점은 워크 팩터의 적절한 설정이다. 너무 낮으면 빠르게 해시가 생성되지만 보안 강도가 약해지고, 너무 높으면 합법적인 사용자의 로그인 과정에서도 지나치게 긴 지연을 초래할 수 있다. 따라서 시스템의 성능과 보안 요구사항 사이의 균형을 찾아야 한다. 또한, BCrypt는 출력 해시 길이가 고정되어 있지만(예: 60자), 이는 내부적으로 충분한 안전 마진을 가지고 설계되었다.
현재까지 BCrypt는 암호 저장을 위한 업계 표준 중 하나로 널리 인정받고 있으며, 시간이 지나도 조정 가능한 워크 팩터 덕분에 장기적인 보안성을 보장한다. 그러나 어떠한 암호화 기술도 절대적이지 않으므로, 강력한 암호 정책과 함께 다중 인증 같은 추가 보안 계층을 적용하는 것이 권장된다.
