비밀번호 암호화 함수로 Bcrypt를 사용하는 이유
비밀번호 암호화를 할 시 bcrypt를 추천하는 글들이 많았다. 스프링에서도 BCryptPasswordEncoder 사용을 권장하는데, 왜 그런지 궁금해서 찾아보았다.
해시 함수의 취약점
SHA, MD5 등의 해시 함수는 메시지 송수신시 무결성 검사를 위해 개발되었으며 이로 인해 빠른 처리속도로 보안에 취약하다(GPU를 사용하면 레인보우 테이블을 매우 빠르게 만들 수 있다). 따라서 패스워드 암호화에는 적합하지 않다.
해시 함수의 문제점을 보완해서 나온 암호화 함수에는 pbkfd2와 bcrypt 등이 있다. 이 둘은 salt와 같은 랜덤 문자열을 섞고 반복적인 해싱작업으로 해시를 강하게 한다. (함수 반복 횟수를 늘리면 연산속도를 늦출 수 있으므로 brute-forece 공격에 대비할 수 있기 때문)
brute-forece 공격이란? 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 무차별 대입 공격
추천되는 암호화 함수 종류
PBKDF2 (Password-Based Key Derivation Function)
- 해시 함수의 컨테이너 역할을 한다.
- sha256이나 sha512를 사용해서 해싱한다.
- ISO 표준에 적합하며 NIST에 의해서 승인된 알고리즘이다.
BCrypt
- blowfish 암호화를 기반으로 설계된 암호화 함수로 가장 강력한 해시 메커니즘 중 하나이다.
- SHA-1를 사용해서 해싱한다.
- 입력 값으로 72 bytes character를 사용해야 하는 제약이 있다.
blowfish: 키(key) 방식의 대칭형 블록 암호 알고리즘으로 비특허이므로 일반 목적으로 사용가능하다. 처리 시간 및 자원 소비를 최적화 하고 속도가 빠르다. 키가 자주 변경되지 않을 때 최적의 성능을 보여준다. 각종 온라인 게임의 패킷 암호화 등에 사용된다.
대칭형 알고리즘 : 데이터의 암호화와 복호화를 위해서 동일한 키를 사용하는 알고리즘. 암호화와 복호화를 위해 다른키를 사용하는 RSA 등에 비해서 사용하기가 간단하고 더 빠르다
SCrypt
- 2009년에 publish된 key derivation function
- 오프라인 brute forece 공격에 대해 더 강력하지만, 하드웨어 구현 비용이 높다.
- OpenSSL 1.1 이상을 제공하는 시스템에서만 작동한다.
- 여러 언어의 라이브러리로 제공된다.
따라서 가능하다면 bcrypt나 pbkdf2를 사용하고 나머지는 사용하지 않는 것이 좋다.
bcrypt와 pbkdf2는 암호화 소요시간 설정에도 영향을 받기 때문에, pbkdf2의 반복횟수를 조절하면 bcrypt와 비슷한 성능을 낼 수도 있다.
암호화 강도를 정리하자면 bcrypt >= pbkdf2 >넘사벽 > sha512 >= sha256 > sha1 > md5 이 된다.
결론 : 그래서 뭘 써야 하나요?
- ISO-27001 보안 규정을 준수해야하는 상황이면 PBKDF2를 사용하고, 그렇지 않다면 구현이 쉽고더 강력한 Bcrypt를 사용하자
- OWASP(오픈소스 웹 어플리케이션 보안 프로젝트 에서는 Bcrypt 사용을 권장하며 pbkdf2의 반복횟수는 최소 10,000회에서 최대 100,000회까지 권장
- 보안 시스템을 구현하는데 많은 비용을 투자할 수 있다면 Scrpyt를 사용하자