debian:trixie 컨테이너 환경에서 작성된 글입니다.
ai로 공부하면서 작성한 글입니다.
BCrypt
비밀번호를 안전하게 저장하기 위해 설계된 암호화 해시 함수.
특징
- 단방향 : 해시된 비밀번호는 평문으로 되돌릴 수 없다. 그래서 DB가 유출되더라도 원래 비밀번호를 알아낼 수 없다.
- 랜덤 솔트 : 같은 비밀번호를 쓰는 유저가 100명이어도 랜덤 솔트값이 포함되기 때문에 해시값은 모두 다르게 나타난다.
- 적응형 비용 : 해시를 계산할 때 반복 횟수를 설정할 수 있다. 이것을 높여서 해시 계산속도를 의도적으로 늦춘다면 사용자는 0.1초 걸리는 작업이라도, 브루트포스 공격자는 1억번 공격에 1천만초나 (대략 4개월) 사용해야 한다.
구조
BCrypt로 생성된 문자열은 아래와 같은 형식을 띤다.
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/zBthUtZ8STbz8SZFp6.D9l/pny
- $2a$ : 알고리즘 식별자 (버전)
- $12$ : 비용. 2^12번 반복했다는 뜻. 12가 기본값이다. 나는 12로 설정하면 한번에 0.4초정도 걸렸다.
- R9h/cIPz0gi.URNNX3kh2O : 22자의 랜덤 솔트
- PST9/zBthUtZ8STbz8SZFp6.D9l/pny : 실제 비밀번호 해시값
인증 방법
비밀번호를 복호화 할 수 없는데 어떻게 확인할까?
- 유저가 로그인을 시도해 비밀번호를 전달한다.
- 서버는 DB에 저장된 해시값에서 솔트와 비용설정을 추출한다.
- 방금 입력받은 비밀번호에 똑같은 솔트와 비용을 적용해 해시를 만든다.
- 새로 만든 해시와 DB의 해시가 일치하는지 확인한다. 일치하면 인증 성공.
C/C++에서 사용하기
의존 패키지들 설치하기
debian:trixie 컨테이너 환경(리눅스)에서 해봤다.
apt update -y
apt install -y git make cmake g++
libbcrypt 설치
GitHub - trusch/libbcrypt: A c++ wrapper around bcrypt password hashing
A c++ wrapper around bcrypt password hashing. Contribute to trusch/libbcrypt development by creating an account on GitHub.
github.com
설치방법은 위 깃허브 래포지토리에 나와있는대로다.
git clone https://github.com/trusch/libbcrypt
cd libbcrypt
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
과정이 완료되었다면 git clone으로 생성된 폴더는 이제 지워도 된다.
테스트파일 소스코드
#include "bcrypt/BCrypt.hpp"
#include <iostream>
int main(){
std::string password = "test";
std::string hash = BCrypt::generateHash(password);
std::cout << BCrypt::validatePassword(password,hash) << std::endl;
std::cout << BCrypt::validatePassword("test1",hash) << std::endl;
return 0;
}
g++ --std=c++11 main.cpp -lbcrypt
깃허브 사이트에서는 -lbcrypt를 main.cpp보다 앞에 쓰는데, 뒤에 써야 된다. (내 환경만 그런걸지도)

잘 된다!
'공부 > CS' 카테고리의 다른 글
| openssl BIO를 사용해 암호화 통신 구현하기 with.c++, IOCP (0) | 2026.04.06 |
|---|---|
| I/O Multiplexing IOCP 에코서버 만들기 with.C/C++ (0) | 2026.03.26 |
| SMTP로 이메일 보내기 with.C/C++ (0) | 2026.03.14 |
| SIGPIPE (0) | 2026.03.02 |
| openssl SSL_get_error 에러코드 with.C/C++ (0) | 2026.02.26 |