본문으로 건너뛰기
AZ Tools

PBKDF2 키 유도

브라우저에서 PBKDF2-HMAC으로 비밀번호에서 키를 유도합니다. 해시와 반복 횟수, 출력 길이를 고르고 결과를 16진수나 Base64로 읽습니다.

사용법

  1. 비밀번호와 솔트를 넣습니다. 솔트가 텍스트가 아니라 바이트로 저장되어 있다면 16진수 체크 상자를 켜십시오.
  2. 해시와 반복 횟수를 고르거나 프리셋을 쓰십시오. 대조용으로는 RFC 벡터, 실제 사용에는 OWASP 수치가 있습니다.
  3. 출력 길이를 비트로 정하고 파생 키를 16진수나 Base64로 복사합니다.

자세한 설명

펼치기

PBKDF2는 비밀번호에 HMAC을 수천 번 이상 돌려서 키로 바꿉니다. 목적은 비밀 유지가 아닙니다. 알고리즘도 공개되어 있고 솔트도 공개되어 있습니다. 목적은 비용입니다. 비밀번호를 추측하는 공격자는 추측마다 같은 반복 횟수를 지불해야 합니다. 비밀번호와 솔트, 반복 횟수, 해시, 그리고 원하는 출력 비트 수를 정하면 브라우저 자체의 WebCrypto 구현으로 유도가 실행됩니다. 어디로도 전송되지 않습니다.

기본값은 RFC 6070의 세 번째 테스트 벡터를 재현합니다. password와 salt에 HMAC-SHA1을 4096번 돌리면 4b007901b765489abead49d926f721d065a429c1이 나옵니다. 이 벡터가 이 도구를 디버깅에 쓸모 있게 만드는 이유입니다. 서버와 이 페이지가 키에 대해 다른 답을 낸다면 둘 중 하나가 비밀번호나 솔트를 다르게 부호화하고 있는 것이고, 공통 기준점이 어느 쪽인지를 알려 줍니다. 솔트는 텍스트로도 16진수로도 넣을 수 있습니다. 데이터베이스에서 꺼낸 솔트는 출력 가능한 문자인 경우가 거의 없기 때문입니다.

반복 횟수는 계속 움직이는 목표여서, 10만 회 미만이면 칸이 경고를 띄웁니다. OWASP의 현재 비밀번호 저장 권고는 HMAC-SHA256에 60만 회, HMAC-SHA512에 21만 회입니다. 차이는 64비트 하드웨어에서 SHA-512가 한 라운드에 더 많은 일을 한다는 데 있습니다. 프리셋을 둔 이유는 이 숫자가 십 년 전 강의에서 물려받은 값이 아니라 선택이 되게 하려는 것입니다.

출력 길이에 대해 알아 둘 점이 하나 있습니다. PBKDF2는 해시 크기만큼의 블록을 하나씩 만들어 키를 이어 붙이므로, 해시가 내놓는 비트보다 많이 요구하면 블록마다 사슬 전체를 다시 돌립니다. HMAC-SHA256에서 512비트를 요구하면 256비트를 요구할 때의 정확히 두 배 비용이 들지만 더 강해지는 것은 없습니다. 안전성은 여전히 같은 256비트 함수에 달려 있기 때문입니다. 그런 일이 생기면 도구가 알려 줍니다.

마지막으로 솔직한 유의사항. PBKDF2에는 메모리 경도가 없어서 GPU와 전용 하드웨어에서 값싸게 병렬화됩니다. 규격이나 플랫폼이 요구하는 자리에서는 여전히 올바른 선택이지만, 새로 비밀번호를 저장한다면 Argon2id나 scrypt가 더 잘 방어된 선택입니다.

자주 묻는 질문

같은 입력인데 서버가 다른 키를 내놓는 이유는?

알고리즘 차이보다 부호화 차이가 거의 항상 원인입니다. 이 페이지는 비밀번호를 UTF-8로 부호화하고, 16진수 상자를 켜지 않으면 솔트도 그렇게 합니다. 솔트를 원시 바이트로 저장하고 16진수로 건네주는 서버, 또는 비밀번호의 Base64 형태를 해시하는 서버는 다른 답을 냅니다. 먼저 양쪽에서 RFC 6070 벡터를 재현해 보십시오. 그것이 맞으면 알고리즘은 문제가 없고 차이는 무엇을 먹이고 있는지에 있습니다.

솔트는 얼마나 길어야 합니까?

암호학적 난수 생성기가 낸 값으로 최소 16바이트이고, 비밀번호마다 달라야 합니다. 솔트는 비밀이 아닙니다. 해시 옆에 저장됩니다. 그 역할은 같은 비밀번호를 쓰는 두 사용자가 다른 키를 받게 해서, 미리 계산한 표 하나로 모두를 동시에 공격할 수 없게 하는 것입니다. 공유된 솔트나 고정된 솔트는 그 이점을 완전히 내줍니다.

PBKDF2는 아직 써도 됩니까?

새로 비밀번호를 저장한다면 첫 번째 권고는 Argon2id, 두 번째는 scrypt입니다. 둘 다 많은 메모리를 요구하도록 설계되어서, PBKDF2를 값싸게 공격하게 만드는 병렬 하드웨어에 저항합니다. PBKDF2는 요구되는 자리에서는 여전히 온당합니다. FIPS 검증 환경, WPA2, 여러 파일 형식이 그렇습니다. 그리고 반복 횟수가 충분히 높다면 맨 해시를 저장하는 것보다 훨씬 낫습니다.

출력을 길게 하면 키가 더 강해집니까?

바탕이 된 해시를 넘어서지는 않습니다. PBKDF2는 해시 크기의 블록을 만들어 이어 붙이므로 HMAC-SHA256에서 512비트 출력은 블록 두 개입니다. 계산은 두 배인데 키의 강도는 여전히 SHA-256에 묶여 있습니다. 쓰는 암호가 요구하는 길이를 요청하고 — AES-256이면 256비트 — 남는 예산은 반복 횟수에 넣으십시오.

반복 횟수를 높이면 페이지가 잠깐 멈추는 이유는?

WebCrypto 유도는 비동기이지만 중간에 끊을 수 없기 때문입니다. 한번 시작하면 브라우저는 모든 라운드를 끝낸 뒤에야 돌려줍니다. OWASP 수준의 횟수라면 휴대전화에서 눈에 띄게 멈추는데, 그 체감 자체가 쓸모 있습니다. 공격자가 추측 한 번에 지불하는 비용이 바로 그것입니다.

관련 도구