불충분한 엔트로피, 암호화폐에서 수백억 손실의 원인
엔트로피 기준이 제대로 적용되지 않으면, 다음 수십억 달러 손실은 이미 진행 중일 수 있어요.
이 문서는 다음 언어로 제공됩니다:
2026년 7월 31일, 한 공격자가 25분 만에 약 500개의 비트코인 지갑을 비웠어요. 이 공격으로 약 594 BTC, 당시 약 3,800만 달러 상당의 자산이 이동됐고, 피해자들은 모두 이런 사태를 막기 위해 하드웨어 지갑을 구매했던 사람들이었어요.
Coinkite disclosed that COLDCARD firmware had been generating keys using a software pseudorandom number generator rather than the hardware generator built into the device. Two functions in the codebase shared the same name and signature, so the linker selected the wrong one, and the build produced no warning.
이 사례는 긴 목록의 최신 항목이에요. 지난 10년 동안 가장 큰 암호화폐 손실은 복잡한 해킹이 아니라 충분히 무작위적이지 않은 난수에서 더 자주 발생했어요.
개인 키 뒤에는 무엇이 있을까요?
앱, 브라우저 확장 프로그램, 하드웨어 지갑 등 어떤 형태든 암호화폐 지갑은 한 가지 핵심에 의존해요. 바로 아무도 예측하거나 복원할 수 없는 숫자를 제대로 생성하는 거예요. 여기서 엔트로피란, 생성된 숫자에 얼마나 예측 불가능성이 담겼는지를 의미해요.
Entropy is the raw randomness a wallet uses to create a private key, measured in bits. More bits mean a larger space of keys that an attacker must search. It enters a wallet at setup. Every key, address, and signature after that follows fixed mathematical rules, so no new randomness arrives later.
엔트로피 소스
원칙적으로, 지갑은 pseudorandom number generator (PRNG)에서 난수를 얻을 수 있어요. PRNG는 적은 양의 “진짜” 엔트로피를 필요한 만큼 늘려주는 알고리즘이지만, 시작 시드 자체가 예측 불가능해야만 안전해요.
브라우저 탭이나 부팅 직후 스마트폰에서 실행되는 소프트웨어는 일종의 감각 차단 상태에서 시작해요. 정말 무작위적인 숫자를 만들려면, 프로그램은 외부 세계에서 오는 예측 불가능한 “노이즈”가 필요해요. 예를 들어 프로세서의 타이밍 변화, 마우스 움직임, 특수 하드웨어 요소 등이 그 역할을 할 수 있어요.
디바이스가 켜진 직후 몇 밀리초 동안은 이런 노이즈 풀이 비어 있거나 충분히 초기화되지 않았을 수 있어요. 암호화 라이브러리가 난수 생성기를 너무 일찍 호출하면, 얕은 우물에서 물을 길어오는 셈이라서, 기술적으로는 무작위지만 공격자가 전수조사할 수 있을 만큼 작은 범위의 숫자가 나올 수 있어요.
브라우저는 추가적인 제약도 있어요. JavaScript의 Math.random()은 보안을 고려해 설계된 함수가 아니고, 더 안전한 crypto.getRandomValues()조차 운영체제의 엔트로피 풀에 의존해요. 이 풀이 약하면(모바일 샌드박스, 가상머신, IoT 기기 등에서 자주 발생), 무작위성이 코드에 도달하기 전에 이미 손상될 수 있어요.
트랜잭션 서명에서의 무작위성
비트코인이나 이더리움 트랜잭션에 서명할 때, 개인 키를 직접 사용하지 않아요. 대신 nonce라는 일회성 무작위 숫자를 만들고, 이를 개인 키와 결합해 Elliptic Curve Digital Signature Algorithm(ECDSA)으로 서명을 생성해요.
하지만 여기서 중요한 점이 있어요. 같은 nonce를 같은 개인 키로 두 번 사용하면, 수학적으로 공격자가 개인 키를 알아낼 수 있는 모든 정보가 공개돼요.
ECDSA 서명은 (r, s)라는 두 숫자로 구성되며, 다음과 같은 요소를 포함하는 특정 수식을 만족해요:
- 개인 키 (d)
- nonce (k)
- 해시된 트랜잭션 메시지 (z)
k가 서로 다른 두 메시지에서 같으면, 두 식이 나란히 맞춰져서, 두 서명을 본 누구나 k를 계산할 수 있어요. k가 알려지면 d(개인 키)도 곱셈과 모듈러 역산만으로 바로 드러나요.
2013년에는 a flaw in Android’s SecureRandom function caused early Bitcoin wallets on the platform to produce predictable nonces. Funds vanished from wallets before most users had any idea there was a problem.
일반적인 코드 오류와 달리, 난수 품질이 낮은 문제는 소스코드만 읽어서는 알 수 없어요. 함수 호출이 겉보기에 올바르더라도, 실제로 생성되는 비트를 측정하고 통계적으로 예측 불가능성을 검증하지 않으면, 치명적인 약점이 수개월, 수년간 숨어 있다가 인내심 있는 공격자에게 노출될 수 있어요.
엔트로피가 끈질긴 취약점으로 남는 이유는 다음과 같이 정리할 수 있어요:
시동 엔트로피 부족: 막 켜진 기기는 PRNG 시드를 위한 환경 노이즈가 충분히 쌓이지 않았을 수 있어요.
브라우저 한계: JavaScript의 Math.random()은 안전하지 않고, crypto.getRandomValues()도 호스트 환경의 엔트로피 풀에 의존해요.
안전하지 않은 도구: Vanity 주소 생성기, 오프라인 스크립트, 관리가 부실한 라이브러리는 속도나 재현성을 위해 무작위성을 희생하는 경우가 많아요.
사람의 입력: '브레인월렛'이나 사용자가 직접 고른 문구는 사전 대입 공격으로 쉽게 뚫렸어요.
암호학자들은 오래전부터 하드웨어 난수 생성기(HRNG, true RNG)를 선호해 왔어요. HRNG는 전자 지터, 열 노이즈, 방사성 붕괴 등 물리적 현상을 무작위 비트로 변환하며, 스스로 오류나 편향을 지속적으로 검사할 수 있어요.
하드웨어가 해결하는 방법
보안이 중요한 시스템에서는 해답이 명확해요. 인증된 HRNG가 내장된 칩 안에서 키를 생성하고, 그 키가 복제되지 않도록 하는 거예요.
A secure element is a purpose-built, tamper-resistant microcontroller. It is a fortified chip designed to store secrets and perform cryptographic operations without revealing the underlying keys. They are the same class of component used in passports to prevent cloning, SIM cards to authenticate devices to mobile networks, and contactless payment cards to authorize transactions.
A secure element can house a hardware random number generator that draws its unpredictability from physical noise, such as thermal fluctuations or oscillator jitter, rather than from mathematical algorithms alone.
이런 HRNG는 '한 번만' 사용하는 장치가 아니에요. NIST SP 800-90B 같은 표준에 따라, 모든 출력 스트림에 대해 통계적 편향, 고정 비트, 기타 오류가 있는지 지속적으로 검사해야 해요. 이상 징후가 발견되면 칩이 즉시 키 생성을 중단할 수 있어요. 좋은 하드웨어 지갑에서는 보안 칩의 HRNG가 칩 내부에서 직접 키 생성 과정에 난수를 공급해요.
모든 '하드웨어'가 같은 것은 아니에요
하드웨어 지갑이라는 용어는 다양한 설계를 포괄하며, 모두가 엔트로피와 키 격리에 동일한 수준의 보호를 제공하는 것은 아니에요.
저가형 제품은 범용 마이크로컨트롤러 기반으로 만들어져, 물리적 공격이나 사이드채널 공격에 견디는 것보다는 유연성에 초점을 맞췄어요. 이들 중 상당수는 기본적인 난수 생성기만 내장하고 있어요.
하지만 이마저도 기기 내부 상태로 시드된 의사난수 생성기일 수 있고, 표준에 맞게 검증된 HRNG가 아닐 수 있어요. 이런 설계에서는 펌웨어에서 키가 생성되고, 결과 개인 키가 일시적으로 RAM이나 플래시 메모리에 저장될 수 있어요. 즉, 펌웨어 취약점, 사이드채널 공격, 물리적 변조가 성공하면 키가 노출될 수 있다는 뜻이에요.
반면, 보안 칩 기반 지갑은 엔트로피 소스와 키 생성 로직 모두를 변조 방지 환경 내에 두고, 암호 연산(서명, 파생)도 칩 내부에서만 처리해요. 최종 서명이나 공개 키만 외부로 나가고, 비밀은 절대 밖으로 나오지 않아요.
이미 존재하는 표준
무작위성 문제는 미해결 과학이 아니에요. 암호학자들은 이미 좋은 엔트로피가 어떤 모습이어야 하는지 표준화했어요. 미국 National Institute of Standards and Technology(NIST)는 SP 800-90 시리즈 표준을 발표해, 문제를 명확하게 분해했어요.
SP 800-90B는 엔트로피 소스(예측 불가능한 비트를 만들어내는 물리적/소프트웨어 과정) 평가 방법을 다루고, 각 비트스트림의 실제 엔트로피를 통계적으로 분석하고, 내장된 건강 검사를 통해 지속적으로 오류나 편향을 감시하도록 요구해요.
SP 800-90C는 엔트로피와 deterministic random bit generators(DRBG)를 결합해, 한 소스가 약해져도 출력이 강하게 유지되는 방법을 설명해요.
인증된 기기는 한 번만 난수를 만들고 끝나는 것이 아니라, 스스로를 지속적으로 점검해요. HRNG의 노이즈 패턴이 변하거나, 비트가 '고정'되거나, 출력이 통계 임계값을 넘지 못하면, 시스템이 키 생성을 중단해 약한 키가 만들어지는 것을 막아요.
내 키가 위험한지 확인하는 방법
대부분의 사용자는 엔트로피를 직접 측정할 수 없지만, 키가 어디서 어떻게 만들어졌는지 질문해 볼 수 있어요. '웹페이지에서' 또는 '오래된 Android 앱에서' 생성된 키(특히 2010년대 중반 이전)는 약할 가능성이 높아요. 가장 안전한 방법은 인증된, 문서화된 무작위성을 사용하는 하드웨어 기기에서 새 지갑을 만들고, 자산을 그곳으로 옮기는 거예요.
엔트로피 공격 연대표
약한 엔트로피는 공격자가 역산할 필요조차 없게 만들어요. 공격자는 취약한 생성기가 만들 수 있는 키 후보를 모두 나열하고, 각 주소를 블록체인에서 조회해 잔고가 있으면 바로 탈취해요. 주요 사례는 다음과 같아요:
2018—IOTA 시드 생성기 사기: 사용자가 웹사이트에서 지갑 시드를 만들도록 유도됐고, 사이트 운영자가 시드 사본을 보관해 나중에 자금을 탈취했어요. 약 400만 달러가 도난됐고, 이 경우 무작위성은 사실상 0이었어요. 공격자가 이미 모든 숫자를 알고 있었기 때문이에요.
2019—Blockchain Bandit: 보안 연구자들이 732개의 약한 이더리움 개인 키를 발견했고, 알려지지 않은 공격자가 수년간 해당 주소를 지켜보다가 자금이 입금되면 약 45,000 ETH를 즉시 빼갔어요.
2022—Profanity vanity 주소 취약점: 오픈소스 Profanity 툴은 단 32비트 엔트로피(약 40억 가지 경우의 수)로 커스텀 이더리움 주소를 생성했어요. 최신 GPU는 몇 시간 만에 이 범위를 모두 탐색할 수 있어요. 런던의 마켓메이커 Wintermute는 이 취약점으로 약 1억 6,000만 달러를 잃었어요.
2023—Trust Wallet 브라우저 확장 취약점: Ledger 보안팀의 공개에 따르면, 해당 브라우저 확장이 약 32비트 엔트로피로 지갑 시드를 생성한 것이 발견됐어요. 빠르게 패치되고 일부 사용자는 보상받았지만, 몇 달간 해당 확장에서 지갑을 만든 사람 모두 위험에 노출됐어요.
2025—LuBian 사건 의혹: Arkham의 주장은 아직 검증되지 않았지만, 127,426 BTC 손실이 예측 가능한 키 생성 때문이라면, 단 한 번의 실수가 수십억 달러 자산을 위험에 빠뜨릴 수 있음을 보여주는 대표 사례가 될 거예요.
2026: COLDCARD: Coinkite disclosed that a software pseudorandom generator had replaced the intended hardware generator in shipped firmware. The fallback entered the upstream dependency in May 2018 and reached key generation in March 2021.
Coinkite estimates about 40 bits of effective search space on Mk3 hardware, and about 72 bits on later models that mixed in secure element data. Both figures sit below the 128-bit target.
A guard existed to prevent exactly this. It tested whether a configuration macro was defined, rather than whether its value was non-zero; the macro was set to zero, so the check passed and the error never fired.
COLDCARD에서 옮길까 고민 중이라면?
Tangem은 인증된 보안 칩 내에서 하드웨어 난수 생성기를 사용해 키를 만들어요.
시드 문구 걱정에서 벗어나고 싶다면, 시드리스(Seedless) 방식을 통해 12~24단어 문구를 적거나 사진 찍거나 잃어버릴 걱정이 없어요. 과거 지갑 해킹의 상당수가 바로 이런 시드 관리 문제에서 시작됐어요.
Cure53, Kudelski, Riscure의 독립 보안 감사를 통과했어요. 바로 이런 순간을 위해 설계됐어요.
진짜 무작위성이 보장되는 곳으로 코인을 옮기세요. Tangem Wallet을 만나보세요.