OneKey 지갑은 복구 구문을 어떻게 생성하며, 그 무작위성은 어디에서 오는가

OneKeyTeam
/최종 업데이트 2026년 8월 6일

주요 결과

  • 지갑 보안의 출발점은 예측 불가능한 엔트로피이며, 복구 구문은 그 엔트로피를 사람이 읽을 수 있게 인코딩한 것에 불과해요.
  • 최근 논란은 libngu에 잘못 설정된 Yasmarang PRNG가 칩의 TRNG를 우회한 문제로, OneKey의 지갑 생성 경로와는 무관해요.
  • OneKey Pro·Classic 1S·Classic 1S Pure는 THD89 SE의 TRNG, Classic은 ATECC608A SE의 TRNG, Mini는 STM32 MCU의 TRNG에서 무작위성을 얻어요.
  • 관련 펌웨어 경로는 libngu·Coinkite·Coldcard·CKCC 의존성을 쓰지 않으며, 여러 차례 감사로 하드웨어 또는 보안 요소의 TRNG를 실제로 호출함이 확인됐어요.
  • 엔트로피 출처와 무관하게 복구 구문이 유출되면 누구나 지갑을 복원할 수 있으므로, 오프라인 백업은 언제나 사용자 본인의 책임이에요.

이 글에서는 OneKey 각 모델이 새 지갑을 만들 때 엔트로피와 복구 구문을 어떻게 생성하는지, 그리고 최근 일부 소프트웨어 난수(RNG) 구현을 둘러싼 우려가 왜 OneKey의 지갑 생성 경로에는 해당하지 않는지 하나씩 짚어 봅니다.

지갑 보안은 아무도 예측할 수 없는 무작위성에서 시작해요

지갑의 보안은 결국 한 가지, 바로 엔트로피(entropy)에서 출발해요. 엔트로피란 지갑을 만드는 데 쓰이는 예측 불가능한 무작위 비트를 말해요. 복구 구문은 이 엔트로피를 사람이 읽을 수 있는 형태로 인코딩한 것일 뿐이에요. 만약 생성 시점의 엔트로피 자체가 예측 가능하다면, PIN이든 복구 구문의 보관 방식이든 주소 파생 방식이든, 그 이후에 무엇을 덧붙여도 이미 벌어진 피해는 되돌릴 수 없어요.

OneKey 모델이 전부 같은 곳에서 무작위성을 끌어오는 것은 아니에요. 각 기기에서 복구 구문 뒤에 자리한 엔트로피가 정확히 어디에서 오는지 아래에 정리했어요.

모델새 지갑을 만들 때의 주요 흐름
ProTHD89 SE TRNG가 무작위성을 공급하고, MCU가 BIP39 / SLIP39를 인코딩
Classic 1STHD89 SE TRNG가 무작위성을 공급하고, MCU가 BIP39 구문을 인코딩
Classic 1S PureTHD89 SE TRNG가 무작위성을 공급하고, MCU가 BIP39 구문을 인코딩
ClassicATECC608A SE TRNG가 무작위성을 공급하고, MCU가 BIP39 구문을 인코딩
MiniSTM32 MCU TRNG가 무작위성을 공급하고, MCU가 BIP39 구문을 인코딩

최근 뉴스에서 다뤄진 문제는 libngu에 잘못 설정된 Yasmarang PRNG로 거슬러 올라가요. 특정 빌드에서 결과적으로 칩의 TRNG를 우회하게 된 사례죠. OneKey의 해당 펌웨어 경로는 libngu, Coinkite, Coldcard, 그 어떤 CKCC 의존성도 사용하지 않으며, 여러 차례의 감사를 통해 실제로 하드웨어 또는 보안 요소(SE)의 TRNG를 호출한다는 점이 확인됐어요. 아래에서는 각 기기가 실제로 사용하는 하드웨어 무작위성 인터페이스를 기기별로 살펴볼게요.

엔트로피란 무엇이고, 지갑은 왜 그것 없이 존재할 수 없을까요?

엔트로피는 측정 가능한 예측 불가능성의 양이라고 생각하면 돼요. 보통 비트(bit) 단위로 세죠. 128비트 엔트로피는 2^128가지의 가능한 초기값이 있다는 뜻이고, 다른 결함이 없는 한 공격자가 할 수 있는 일은 오직 추측뿐이에요. 여러분의 개인키, 주소, 서명 능력은 모두 이 하나의 초기 비밀에서 결정론적으로 파생돼요.

그러니까 복구 구문의 안전성은 영어 단어 열 몇 개가 "많아 보인다"는 데서 오는 게 아니에요. 그 단어들 뒤에 있는 원시 엔트로피가 얼마나 예측 불가능한지에서 나와요.

  • 128비트 엔트로피 → BIP39 단어 12개
  • 192비트 엔트로피 → BIP39 단어 18개
  • 256비트 엔트로피 → BIP39 단어 24개

무작위성이 약하면 공격자는 지갑이 만들어진 순간의 입력을 그대로 재현해 똑같은 구문과 개인키에 도달할 수 있어요. SHA-256도, PIN 보호도, 보안 요소 저장소도, 예측 가능한 입력을 진짜 예측 불가능한 엔트로피로 바꿔 주지는 못해요.

난수에서 복구 구문까지, 실제 계산은 이렇게 이뤄져요

세부 사항은 모델마다 다르지만, 모든 BIP39 지갑은 동일한 계산 모델을 공유해요.

하드웨어 진성 난수 발생기(TRNG)
        ↓
128 / 192 / 256 bit 엔트로피(ENT) 추출
        ↓
SHA-256(ENT)의 앞 ENT / 32 bit를 체크섬(CS)으로 사용
        ↓
ENT || CS를 11 bit 단위로 분할해 각각을 2048개 BIP39 단어 중 하나에 매핑
        ↓
12 / 18 / 24개 단어 → seed → 개인키, 주소, 서명 키

예를 들어 12단어 구문은 128비트 엔트로피에 4비트 체크섬을 더한 총 132비트를 사용하는데, 이는 11비트씩 12개 그룹으로 딱 나누어떨어져요. 각 그룹은 BIP39 단어 목록의 인덱스가 돼요.

여기서 SHA-256 단계는 BIP39 체크섬을 계산할 뿐이지, 난수 발생기가 아니에요. 구문의 무작위성은 여전히 전적으로 생성 시점에 확보한 원시 엔트로피에 달려 있어요.

그렇다면 OneKey의 구현은 왜 이번 ColdCard 문제의 영향을 받지 않을까요? 아래에서 각 모델의 최초 난수가 어떻게 만들어지는지, 그리고 문제의 코드 경로에 발을 들이는 일이 있는지 기기별로 하나씩 살펴볼게요.


OneKey Pro

OneKey ProOneKey Pro

영향을 받나요?

아니요 — 이번 ColdCard libngu / Yasmarang 문제의 영향을 받지 않아요. Pro의 현재 빌드는 기본적으로 THD89를 활성화해요. 기기에서 지갑을 만들 때 THD89의 TRNG가 무작위 입력을 제공하고, 이어지는 BIP39 또는 SLIP39 인코딩은 펌웨어가 처리해요.

생성 흐름

THD89 TRNG → 지갑 초기화 엔트로피 → 펌웨어가 BIP39 또는 SLIP39 인코딩.

Pro의 random.bytes()는 기본값이 source=1이며, 기본 빌드인 USE_THD89=1 조건에서 se_random_encrypted()를 호출해요.

무작위성에 관한 설명

  • Pro의 기본 빌드는 THD89를 활성화하며, 무작위 바이트는 se_random_encrypted()에서 나와요. Yasmarang이나 libngu의 소프트웨어 PRNG 경로가 아니에요.
  • OneKey 헬프 센터에 따르면, 오늘날의 EAL6+ 보안 요소에 탑재된 TRNG는 전자 잡음 같은 물리적 과정에 무작위성의 근거를 둬요.

OneKey Classic 1S

OneKey Classic 1SOneKey Classic 1S

영향을 받나요?

아니요 — 이번 ColdCard libngu / Yasmarang 문제의 영향을 받지 않아요. Classic 1S의 현재 공개된 기기 내 생성 흐름은 THD89 보안 요소의 TRNG에서 엔트로피를 얻고, BIP39 구문 문자열은 MCU 펌웨어가 인코딩해요.

생성 흐름

THD89 TRNG → 128 / 192 / 256비트 엔트로피 → MCU가 BIP39 구문 인코딩.

무작위성에 관한 설명

  • "구문은 THD89가 생성한다"는 표현은 정확하지 않아요. THD89는 무작위 입력을 제공하고, BIP39 단어 인코딩은 MCU 펌웨어에서 이뤄지거든요.
  • 펌웨어는 THD89의 se_random_encrypted() 인터페이스를 호출하며, Yasmarang이나 libngu를 사용하지 않아요. OneKey 헬프 센터에 따르면, 오늘날의 EAL6+ 보안 요소에 탑재된 TRNG는 전자 잡음 같은 물리적 과정에서 무작위성을 만들어 내요.

OneKey Classic 1S Pure

OneKey Classic 1S PureOneKey Classic 1S Pure

영향을 받나요?

아니요 — 이번 ColdCard libngu / Yasmarang 문제의 영향을 받지 않아요. 공개 코드는 Classic 1S Pure에 별도의 엔트로피 생성 분기를 두지 않아요. Classic 1S와 동일한 firmware-classic1s 코드베이스를 공유하거든요. 따라서 Pure로 지갑을 만들 때의 엔트로피도 THD89 TRNG에서 나오고, MCU가 이를 BIP39 구문으로 인코딩해요.

검증된 흐름

THD89 TRNG → 128 / 192 / 256비트 엔트로피 → MCU가 BIP39 구문 인코딩.

Pure가 배터리 없는 제품이라는 점은 이 공개된 생성 경로를 바꾸지 않아요.

무작위성에 관한 설명

  • Pure가 독립된 모델로 판매된다는 이유만으로 다른 엔트로피 메커니즘을 가졌다고 넘겨짚어선 안 돼요.
  • Classic 1S와 마찬가지로, 공개된 생성 코드는 THD89 무작위성 인터페이스를 호출하며 Yasmarang이나 libngu를 사용하지 않아요.

OneKey Classic

OneKey ClassicOneKey Classic

영향을 받나요?

아니요 — 이번 ColdCard libngu / Yasmarang 문제의 영향을 받지 않아요. 보안 요소를 활성화한 Classic 펌웨어 경로에서는 SE가 지갑 생성에 쓰이는 무작위 재료를 제공하고, MCU가 이를 BIP39 구문으로 바꿔요.

생성 흐름

SE가 무작위 재료 제공 → 앞 32바이트를 엔트로피로 사용 → MCU가 BIP39 구문 인코딩.

무작위성에 관한 설명

  • 이 경로는 SE의 초기화 및 내보내기 인터페이스를 통해 무작위 재료를 얻으며, Yasmarang이나 libngu의 RNG 구현을 호출하지 않아요. 그래서 지금 논의 중인 문제의 코드 경로에 발을 들이는 일이 없어요.
  • 공개 코드만으로는 Classic의 배치별 SE 모델과 인증 정보를 일일이 특정할 수 없어요. 대외적으로 설명할 때는 다른 모델의 인증 정보를 Classic에 적용하지 말고, 해당 배치의 칩 문서를 기준으로 삼아야 해요.

OneKey Mini

OneKey MiniOneKey Mini

영향을 받나요?

아니요 — 이번 ColdCard libngu / Yasmarang 문제의 영향을 받지 않아요. Mini의 기기 내 생성 흐름은 STM32 MCU의 하드웨어 난수 발생기에서 엔트로피를 끌어오고, 이어서 MCU가 이를 BIP39 구문으로 인코딩해요.

생성 흐름

STM32 MCU TRNG → 128 / 192 / 256비트 엔트로피 → MCU가 BIP39 구문 인코딩.

Mini의 구형 펌웨어에서는 random32()가 STM32 RNG 주변장치를 직접 읽고, 연속으로 중복되는 출력은 거부해요. 기기 내 생성 흐름은 바로 이 무작위성을 사용해 구문을 만들어요.

무작위성에 관한 설명

  • MCU는 STM32 하드웨어 RNG 주변장치를 직접 읽으며, 펌웨어는 연속 중복 출력도 거부해요. 이 경로는 Yasmarang이나 libngu를 사용하지 않아요.

사용자를 위한 보안 조언

  • 엔트로피가 어디에서 왔든, 복구 구문이 한 번 유출되면 누구나 지갑을 복원할 수 있어요. 오프라인으로, 정확하게 백업하는 일은 언제나 사용자 본인의 책임이에요.
  • 복구 구문을 잃어버리면 그 어떤 기기, 앱, 제조사도 대신 복구해 줄 수 없어요.

더 읽어보기 및 출처

OneKey로 암호화 여정 보호하기

View details for OneKeyOneKey

OneKey

세계에서 가장 진보한 하드웨어 지갑.

View details for 앱 다운로드앱 다운로드

앱 다운로드

글로벌 자산을 거래하세요. 이메일만으로 몇 분 안에 시작할 수 있습니다.

View details for OneKey SifuOneKey Sifu

OneKey Sifu

암호화 의문을 해결하기 위해, 한 번의 전화로.

계속 읽기