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 : 실제 비밀번호 해시값

인증 방법

비밀번호를 복호화 할 수 없는데 어떻게 확인할까?

  1. 유저가 로그인을 시도해 비밀번호를 전달한다.
  2. 서버는 DB에 저장된 해시값에서 솔트와 비용설정을 추출한다.
  3. 방금 입력받은 비밀번호에 똑같은 솔트와 비용을 적용해 해시를 만든다.
  4. 새로 만든 해시와 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보다 앞에 쓰는데, 뒤에 써야 된다. (내 환경만 그런걸지도)

잘 된다!

+ Recent posts