bcrypt는 1999년 Niels Provos와 David Mazières가 설계한 암호화 해시 함수로, 비밀번호 저장 및 검증에 특화된 적응형(adaptive) 해싱 알고리즘이다.
개요 및 배경
인터넷 서비스가 확산되면서 사용자 비밀번호를 안전하게 저장하는 것이 중요해졌다. 단순한 MD5나 SHA 계열 해시 함수는 비밀번호 저장에 적합하지 않다. 이 함수들은 연산 속도가 매우 빠르도록 설계되어 있어, 공격자가 GPU를 활용해 초당 수십억 개의 해시를 계산하는 무차별 대입 공격(Brute Force Attack)이나 사전 공격(Dictionary Attack)에 취약하기 때문이다.
bcrypt는 이 문제를 해결하기 위해 OpenBSD 프로젝트에서 Blowfish 블록 암호 알고리즘을 기반으로 설계되었다. 핵심 설계 목표는 의도적으로 연산 비용이 높은 해시 함수를 만드는 것으로, 공격자의 무차별 대입 공격을 현실적으로 불가능하게 만드는 데 있다.
핵심 특징
작업 인수(Work Factor/Cost Factor): bcrypt의 가장 중요한 특징은 연산 비용을 조절할 수 있는 작업 인수(일반적으로 4~31 범위)다. 이 값이 1 증가할 때마다 연산 시간이 2배씩 증가한다. 예를 들어 작업 인수가 12라면 2¹² = 4,096번의 키 확장 반복이 수행된다. 하드웨어 성능이 향상되더라도 작업 인수를 높여 보안 수준을 유지할 수 있어 '적응형(adaptive)' 해시 함수라 불린다.
솔트(Salt): bcrypt는 128비트(16바이트)의 무작위 솔트를 자동으로 생성하여 해시에 포함시킨다. 솔트는 동일한 비밀번호라도 서로 다른 해시값을 갖게 하여, 레인보우 테이블(Rainbow Table) 공격을 방어한다.
고정 길이 출력: bcrypt는 입력 길이와 관계없이 항상 60자의 해시 문자열을 출력한다.
bcrypt는 Blowfish 암호의 키 스케줄링 알고리즘을 기반으로 한 EksBlowfishSetup` 함수를 핵심으로 한다. 비밀번호와 솔트를 사용하여 Blowfish의 키 확장(key setup)을 반복적으로 수행하고, 그 결과로 생성된 키 상태를 사용하여 고정된 텍스트("OrpheanBeholderScryDoubt")를 64번 암호화한 결과를 최종 해시로 사용한다.
한계 및 주의사항
최대 비밀번호 길이: 일부 bcrypt 구현체는 비밀번호를 72바이트로 제한한다. 72바이트를 초과하는 비밀번호는 잘려서 처리될 수 있으며, 이는 매우 긴 비밀번호의 보안성을 의도치 않게 낮출 수 있다.
Null 바이트 처리: C 언어 기반 구현체 중 일부는 Null 바이트에서 비밀번호를 잘라내는 취약점이 있을 수 있다.
현대적 대안
bcrypt 외에도 비밀번호 해싱에 적합한 알고리즘으로 scrypt(2009)와 Argon2(2015)가 있다. scrypt는 메모리 집약적 연산을 추가하여 GPU를 이용한 병렬 공격을 더욱 어렵게 하며, Argon2는 Password Hashing Competition(PHC)의 우승 알고리즘으로 메모리, CPU, 병렬성을 모두 조절할 수 있는 가장 현대적인 선택지다.
사용 현황
bcrypt는 Ruby on Rails, Laravel, Node.js(bcrypt 패키지), Python(passlib, bcrypt 라이브러리) 등 거의 모든 주요 웹 프레임워크와 언어에서 기본 또는 권장 비밀번호 해싱 방법으로 지원된다. 1999년에 설계된 알고리즘임에도 불구하고, 현재까지도 비밀번호 저장의 표준적인 선택으로 널리 사용되고 있다.
bcrypt는 비밀번호를 안전하게 저장하기 위해 만들어진 특수한 암호화 도구예요. 1999년에 개발된 후 지금까지도 많은 웹사이트에서 사용되고 있어요.
왜 비밀번호를 그냥 저장하면 안 되나요?
여러분이 회원가입할 때 입력한 비밀번호를 웹사이트가 그대로 저장하면, 해커가 데이터베이스를 해킹했을 때 비밀번호가 바로 노출돼요. 그래서 비밀번호를 '해시(Hash)'라는 방식으로 변환해서 저장해요.
해시는 "안녕하세요" → "8d4f2a..." 처럼 알아볼 수 없는 문자열로 바꾸는 거예요. 원래 비밀번호로 돌아갈 수 없어서 안전하죠.
그런데 MD5나 SHA 같은 일반 해시는 너무 빨라요. 해커가 컴퓨터로 초당 수십억 개의 비밀번호 후보를 해시로 변환해서 비교하면, 금방 원래 비밀번호를 알아낼 수 있어요!
bcrypt가 특별한 이유
첫째, 의도적으로 느리게 만들었어요!
bcrypt는 일부러 계산이 오래 걸리도록 설계됐어요. '작업 인수(work factor)'라는 숫자로 얼마나 느리게 할지 조절할 수 있어요. 숫자가 1 올라갈 때마다 2배씩 느려져요.
비밀번호 하나를 확인하는 데 0.1초 걸린다면, 해커는 1초에 10개밖에 못 시도해요. 6자리 숫자 비밀번호라도 100만 개를 다 시도하려면 약 28시간이 걸려요. 반면 일반 해시는 1초에 10억 개 이상 시도가 가능해요.
둘째, 솔트(Salt)가 있어요!
bcrypt는 비밀번호마다 다른 무작위 '솔트'를 섞어서 해시를 만들어요. "password"라는 비밀번호라도 두 사람이 가입하면 완전히 다른 해시가 저장돼요. 덕분에 미리 만들어둔 해시 표(레인보우 테이블)로 공격하는 걸 막을 수 있어요.
셋째, 컴퓨터가 빨라져도 안전해요!
앞으로 컴퓨터가 더 빨라지면, 작업 인수를 높여서 똑같이 느리게 유지할 수 있어요. 이걸 '적응형' 해시 함수라고 해요. 기술이 발전해도 안전성이 유지되는 거예요.
실생활 예시
우리가 사용하는 많은 웹사이트들이 bcrypt를 쓰고 있어요. GitHub, Reddit 등 대형 서비스들이 bcrypt나 그 후속 기술을 사용해서 비밀번호를 보호해요. 파이썬, 자바스크립트, 루비, PHP 등 거의 모든 프로그래밍 언어에서 bcrypt 라이브러리를 쉽게 사용할 수 있어요.
더 최신 기술도 있어요
bcrypt 이후로 Argon2라는 더 강력한 알고리즘도 나왔어요. GPU를 이용한 공격까지 더 잘 막아줘서, 최신 서비스들은 Argon2를 사용하기도 해요. 하지만 bcrypt도 여전히 안전한 선택이에요. 1999년에 만들어졌는데도 아직까지 널리 쓰인다는 건 그만큼 잘 설계된 기술이라는 증거예요!
bcrypt는 비밀번호를 안전하게 숨겨주는 특별한 암호 상자예요!
왜 필요할까요?
여러분이 게임이나 앱에 가입할 때 비밀번호를 만들죠? 그 비밀번호를 그냥 저장하면 나쁜 사람이 훔쳐볼 수 있어요. 그래서 비밀번호를 알아볼 수 없는 이상한 글자들로 바꿔서 저장해요. 이렇게 바꾸는 걸 '해시(hash)'라고 불러요. "안녕"이라는 말이 "8d4f2a..."처럼 완전히 다른 글자로 바뀌는 거예요!
bcrypt의 특별한 점
일부러 느리게 만들었어요!
bcrypt는 아주 복잡한 암호 상자예요. 비밀번호를 알아볼 수 없게 바꾸는데, 일부러 시간이 오래 걸리도록 만들어졌어요! 나쁜 사람이 비밀번호를 알아내려면 하나하나 다 시도해봐야 하는데, 각각 시간이 걸리면 결국 포기하게 돼요.
솔트라는 비밀 재료를 넣어요!
bcrypt는 비밀번호마다 다른 무작위 숫자(솔트)를 섞어서 암호를 만들어요. 같은 "1234" 비밀번호라도 두 사람이 가입하면 완전히 다른 암호가 저장돼요. 덕분에 나쁜 사람이 미리 만들어둔 답표로 공격하는 걸 막을 수 있어요!
컴퓨터가 빨라져도 괜찮아요!
컴퓨터가 더 빨라지면, bcrypt도 더 어렵게 조절할 수 있어요. '작업 인수'라는 숫자를 높이면 더 오래 걸리게 할 수 있거든요.
우리 생활에서는?
많은 게임, 앱, 웹사이트들이 bcrypt를 사용해서 여러분의 비밀번호를 지켜요. 1999년에 만들어진 오래된 기술이지만, 지금도 아주 많은 곳에서 사용하고 있어요. 덕분에 해커들이 비밀번호를 훔쳐도 실제 비밀번호를 알아내기 매우 어려워요. 비밀번호를 안전하게 지켜주는 든든한 보디가드 같은 존재예요!
bcrypt: Secure Password Hashing for the Modern Era
Introduction and Context
As internet services proliferated, securing user passwords became paramount. Traditional hashing algorithms like MD5 and SHA series proved inadequate for password storage due to their high computational speed, making them vulnerable to brute force and dictionary attacks facilitated by powerful GPUs.
bcrypt, designed by Niels Provos and David Mazières in 1999 within the OpenBSD project, addresses this challenge by leveraging the Blowfish encryption algorithm. Its core objective was to create a deliberately resource-intensive hashing mechanism to thwart brute force attacks effectively.
Key Features
Work Factor/Cost Factor: bcrypt's defining characteristic is its adjustable work factor (typically ranging from 4 to 31), directly influencing computational cost. Each increment roughly doubles processing time, ensuring adaptability against escalating computational power while maintaining robust security.
Salt: Automatically generating a 128-bit (16-byte) random salt for each hash significantly enhances security by preventing rainbow table attacks, ensuring unique hashes even for identical passwords.
Fixed Output Length: Regardless of input length, bcrypt consistently produces a 60-character hash output, simplifying implementation and comparison.
$2b$: Identifier for the bcrypt algorithm version.
12: The configured cost factor (work factor).
Subsequent 22 characters: Base64-encoded random salt.
Final 31 characters: Base64-encoded hash output.
Algorithm Operation
At its core, bcrypt utilizes the EksBlowfishSetup` function derived from Blowfish's key scheduling algorithm. It iteratively expands the password and salt to generate Blowfish keys, then encrypts a fixed string ("OrpheanBeholderScryDoubt") 64 times using these keys, yielding the final hash value.
Limitations and Considerations
Password Length: Some implementations impose a 72-byte limit on passwords, potentially truncating excessively long passwords and inadvertently compromising security.
Null Byte Handling: Certain C-based implementations may exhibit vulnerabilities related to handling null bytes within passwords.
Modern Alternatives
While bcrypt remains highly regarded, newer algorithms like scrypt (2009) and Argon2 (2015) offer enhanced security features:
scrypt: Introduces memory-intensive operations to resist GPU-accelerated parallel attacks.
Argon2: Winner of the Password Hashing Competition (PHC), Argon2 provides comprehensive control over memory, CPU, and parallelism, representing the cutting edge in password hashing.
Usage
Despite its origins in 1999, bcrypt continues to be a foundational choice for secure password hashing across numerous prominent web frameworks and programming languages, including Ruby on Rails, Laravel, Node.js, and Python. Its enduring popularity underscores its effectiveness in safeguarding sensitive user credentials in today's digital landscape.
English version not yet available.
English version not yet available.
문서 정보
최초 작성
최종 갱신
분량
2,022자 (성인 기준)
분류
기술
HANGUL.WIKI가 정리·작성한 문서입니다. 정확성을 위해 노력하나 오류가 있을 수 있으므로,
중요한 내용은 공식 출처를 통해 확인하시기 바랍니다.
내용의 오류나 정정 요청은 오류·정정 신고로 알려주시면 검토 후 반영합니다.