Python bcrypt를 활용해 비밀번호 hashing 할 때 발생하는 에러.

bcrypt 라이브러리는
패스워드 해싱을 위한 라이브러리다.
https://pypi.org/project/bcrypt/

그런데 프로젝트 설명을 보면 argon2id나 scrypt를 사용하라고 권장하고 있다.
왜 인지는 모른다.

4.3.0 버전에서는 해싱함수가 정상적으로 작동했으나
최신버전은 5.0.0에서는 다음과 같은 ValueError가 발생한다.

ValueError: password cannot be longer than 72 bytes, truncate manually if necessary

프로젝트 Changelog를 보면 다음과 같이 나와있다.
hashpw에 전달되는 패스워드가 72바이트보다 길면
ValueError를 일으키도록 되어있다.

이전까지는 Error를 Raise하지 않고
라이브러리 내에서 truncate해서 return했다고 한다.
(OpenBSD의 bcrypt 구현)


Python 3.14 환경을 사용해야하는 제약이 없다면
4.3.0으로 다운그레이드하거나
직접 ValueError를 핸들링해주는 방법이 있겠다.



======================================================


여담으로 본래 고속 연산 작업을 하기 위해
C로 작성된 소스코드가 컴파일된 .so 형태로 존재했고
CFFI ( C Foreign Function Interface )가
python <-> c간의 인터페이스 변환 역할을 했다.


그러나 현대에 이 라이브러리는 최신버전 4.0.0 이후
보안성과 메모리 안전성을 위해 Rust로 작성하였고 (.rs)
src/lib.rs에서 그 흔적을 찾아볼 수 있다.


PyO3라는 라이브러리를 통해 Rust와 Python 소스코드를 바인딩하고
Rust 컴파일러인 rustc가 기계어 파일로 컴파일 한다.


본문에서 말한 hashpw 함수는
lib.rs 소스코드의 
68 ~ 138에 해당한다.

해당 소스코드에서는

    let hashed = py

        .detach(|| bcrypt::hash_with_salt(password, cost, raw_salt))

        .map_err(|_| pyo3::exceptions::PyValueError::new_err("Invalid salt"))?;


 위 코드가 validation을 거친 후 실제 연산이 수행되는 부분이다.


Python의 GIL을 해제하고
Rust의 bcrypt 크레이트 라이브러리에 구현된 함수, hash_with_salt에서 해싱을 수행한다.
map_err에서 Rust에러를 Python에러로 번역한다.








댓글

이 블로그의 인기 게시물

Blogger 커스터마이징 : CSS 수정 (sticky-header)

노마드코더 개발자북클럽 Clean code 완주, 독후감

노마드코더 개발자북클럽 Clean code TIL 7 : 7장. 오류 처리