489 / 691PBKDF2

PBKDF2

BIP39의 seed 파생

PBKDF2는 반복 계산으로 입력 텍스트와 솔트를 파생 키로 바꿉니다. BIP39는 이를 사용해 단어 구문과 passphrase를 seed로 변환하며, 새로운 무작위성을 생성하지 않습니다.

Password-Based Key Derivation Function 2는 입력, 솔트, 반복 횟수, 의사난수 함수와 출력 길이를 매개변수로 쓰는 결정적 파생 함수입니다. BIP39는 특정 PBKDF2-HMAC-SHA512 구성을 정하며 PBKDF2의 모든 사용법을 정하지는 않습니다.

password라고 부르는 입력은 UTF-8 NFKD 단어 구문입니다. 솔트는 mnemonic + passphrase이며 역시 UTF-8 NFKD를 사용합니다. passphrase가 없으면 빈 값을 붙입니다. BIP39는 HMAC-SHA512, 2048회 반복, 64바이트 즉 512비트 출력을 요구합니다. [BIP39 — Mnemonic generation and seed conversion]

PBKDF2는 비밀번호 입력, 솔트와 출력 블록 인덱스로 첫 중간 결과를 만듭니다. 이후에는 같은 의사난수 함수를 이전 결과에 적용해 중간 결과를 계산하고 값들을 XOR로 결합합니다. HMAC-SHA512의 블록은 64바이트이므로 BIP39에는 블록 하나가 필요합니다. 텍스트에 SHA-512를 단순히 2048번 적용하는 것으로는 충분하지 않습니다. [RFC8018 — PBKDF2 construction] [BIP39 — Mnemonic generation and seed conversion]

정규화된 입력과 매개변수가 같으면 같은 seed가 나옵니다. 복구할 때 임의로 2048회 반복을 늘리거나 함수를 바꾸는 것은 기존 지갑의 보안을 개선하지 않습니다. 결과가 규정된 BIP39 파생과 달라지기 때문입니다. 다른 단어 목록으로 번역하는 것도 중립적인 변경이 아닙니다. [BIP39 — Mnemonic generation and seed conversion]

반복은 한 번의 시도에 필요한 작업을 늘리지만 독립적인 비밀 무작위성을 추가하지 않습니다. 단어와 지갑 비교 데이터를 가진 공격자는 약한 passphrase를 오프라인으로 시도할 수 있습니다. 따라서 512비트 출력은 512비트 엔트로피와 같은 보호를 뜻하지 않으며 2048은 새 시스템의 보편적인 권장값이 아닙니다. [RFC8018 — PBKDF2 construction] [BIP39 — Mnemonic generation and seed conversion]

BIP39 checksum은 사용 전에 단어 오류를 찾는 데 도움이 됩니다. PBKDF2 변환 자체는 구문 생성 및 검사와 별개이며 passphrase가 찾는 지갑에 속한다는 증명을 주지 않습니다. 이후 BIP32나 다른 결정적 방식이 다음 단계에서 seed를 사용할 수 있습니다. [BIP39 — Mnemonic generation and seed conversion]

공개 BIP39 테스트 벡터에는 엔트로피, 단어, 테스트 passphrase TREZOR에 대한 예상 seed가 있습니다. 올바른 구현은 전체 출력을 재현하고 NFKD를 따라야 합니다. 알려진 입력을 자금용 개인 백업으로 쓰면 안 됩니다. 테스트 일치만으로 앱 전체의 보안이 검증되는 것도 아닙니다. [BIP39 — Mnemonic generation and seed conversion]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 BIP 39, BIP39 passphrase, Seed Generation, HD Wallet. 다음 항목에서도 이 글을 참조합니다 BIP39 passphrase.

DOC · 001BIP39 — Mnemonic generation and seed conversion명세 ↗DOC · 002RFC8018 — PBKDF2 construction명세 ↗
1차 출처 우선 · 투자 조언이 아닙니다