WIPIVERSE

PBKDF2

PBKDF2(Password-Based Key Derivation Function 2)는 RSA Laboratories의 PKCS(Public-Key Cryptography Standards) 시리즈, 구체적으로 PKCS #5 v2.0에 포함된 암호 기반 키 유도 함수이다. 이후 IETF RFC 2898로 발표되었으며, 2017년 RFC 8018(PKCS #5 v2.1)로 갱신되었다. PBKDF2는 전신인 PBKDF1을 대체하였으며, PBKDF1이 최대 160비트 길이의 키만 생성할 수 있었던 반면 PBKDF2는 사실상 무제한 길이의 키를 생성할 수 있다.

PBKDF2의 주된 목적은 사용자가 입력한 암호(password 또는 passphrase)로부터 암호학적 키를 안전하게 유도하는 것이다. 암호는 일반적으로 낮은 엔트로피를 가지므로 직접 암호화 키로 사용하기에 부적합하다. PBKDF2는 암호에 솔트(salt)라는 임의의 값을 결합하고, 의사난수 함수(PRF, 주로 HMAC 사용)를 반복적으로 적용하여 최종 키를 생성한다. 이 과정을 키 스트레칭(key stretching)이라고 하며, 무차별 대입 공격(brute-force attack) 및 레인보우 테이블 공격에 대한 저항성을 높인다.

PBKDF2는 다섯 개의 입력 매개변수를 받는다: PRF(의사난수 함수), Password(암호), Salt(솔트), c(반복 횟수), dkLen(원하는 유도 키의 비트 길이). 유도 키 DK는 여러 개의 hLen-비트 블록 T_i로 구성되며, 각 블록은 다음 방식으로 계산된다: T_i = F(Password, Salt, c, i). 함수 F는 PRF를 c회 연쇄적으로 적용한 결과들을 XOR하여 산출한다. 첫 번째 반복 U_1은 PRF(Password, Salt || INT_32_BE(i))이며, 이후 U_j = PRF(Password, U_{j-1})의 형태로 계산된다.

솔트는 암호별로 서로 다른 키가 생성되도록 하여 사전 계산된 해시 테이블(레인보우 테이블) 공격을 방어한다. PKCS #5 v2.1은 최소 64비트 길이의 솔트를 권장하며, NIST SP 800-132는 최소 128비트의 솔트를 권장한다. 반복 횟수는 컴퓨팅 성능의 발전에 따라 지속적으로 증가시켜야 하는 매개변수이다. 2000년 표준 작성 당시 최소 권장값은 1,000회였으나, 2023년 OWASP는 PBKDF2-HMAC-SHA256에 대해 600,000회, PBKDF2-HMAC-SHA512에 대해 210,000회의 반복을 권장하였다.

PBKDF2는 WPA2(Wi-Fi Protected Access 2) 무선 네트워크 보안 프로토콜에서도 사용된다. WPA2는 PBKDF2(HMAC-SHA1, passphrase, ssid, 4096, 256) 형태로 키를 유도한다. 또한 다양한 프로그래밍 언어 및 플랫폼에서 표준 라이브러리로 구현되어 있다(예: .NET의 Rfc2898DeriveBytes, PHP의 hash_pbkdf2, Python의 hashlib.pbkdf2_hmac, Go의 crypto/pbkdf2, Rust의 pbkdf2 크레이트 등).

PBKDF2의 한계로는 상대적으로 적은 메모리만을 사용하여 구현될 수 있다는 점이 지적된다. 이는 ASIC(주문형 집적회로)이나 GPU(그래픽 처리 장치)를 이용한 병렬 공격에 취약할 수 있음을 의미한다. 이러한 단점을 보완하기 위해 bcrypt(더 많은 RAM 필요), scrypt(메모리 사용량 조정 가능), Argon2(2015년 Password Hashing Competition 최종 선정) 등의 대안이 개발되었다. NIST는 비밀번호 지침에서 Balloon hashing을 대안으로 권장하기도 한다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기