암호화폐 서명 검증기

메시지, 서명, 그리고 (선택적으로) 서명했다고 주장하는 주소를 붙여넣으세요. 도구가 이더리움 서명자를 복원하고, Solana ed25519 및 비트코인 BIP-137 서명을 검증하며, 모든 중간 해시를 보여 줍니다. 아무것도 업로드되지 않으며 개인 키는 전혀 필요하지 않습니다.

예시:

브라우저에서 JavaScript로 계산합니다. 주소는 절대 업로드되거나 저장되지 않습니다.

서명 검증기란?

서명 검증기는 메시지, 디지털 서명, 공개 신원(주소 또는 공개 키)을 받아 그 신원이 정확히 그 메시지에 대해 실제로 서명했는지 알려 줍니다. 이더리움에서는 복원(recovery)으로 검사합니다. secp256k1에서는 서명과 메시지 해시로부터 서명자의 공개 키를 계산할 수 있으므로, 이를 해시해 주소를 얻고 비교합니다. Solana(ed25519)와 비트코인의 SegWit 및 레거시 메시지 형식에도 해싱 규칙만 다를 뿐 같은 원리가 적용됩니다. 이 페이지는 오늘날 지갑이 사용하는 네 가지 방식을 모두 공개 데이터만으로 브라우저에서 구현합니다.

지원하는 서명 유형

유형표준서명되는 다이제스트곡선출력
이더리움 personal_signEIP-191 (version 0x45)keccak256("\x19Ethereum Signed Message:\n" + length + message)secp256k1복원된 주소, 일치 배지, 메시지 해시
이더리움 타입 데이터EIP-712 (eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1도메인 구분자, 구조체 해시, 다이제스트, 복원된 서명자
Solana signMessageRFC 8032 Ed25519EdDSA 방정식 내부의 SHA-512, 접두사 없음ed25519유효 / 무효
비트코인 서명 메시지BIP-137 (Bitcoin Core signmessage)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message)secp256k1복원된 키, 도출된 주소, 일치 여부

이더리움 복원의 원리

ECDSA 서명은 (r, s) 쌍입니다. 32바이트 다이제스트와 복원 id v가 주어지면 후보 공개 키는 최대 두 개이며, v가 그중 하나를 선택합니다. 도구는 선택한 표준에 따라 다이제스트를 계산하고, 64바이트 공개 키를 복원한 뒤, 그 Keccak-256 해시의 마지막 20바이트를 취해 주소를 얻고, 예상 주소를 입력했다면 이와 비교합니다. 주소는 조회하는 것이 아니라 도출하는 것이므로, 일치한다는 것은 서명 시점에 키를 보유하고 있었다는 증명이 되며 온체인 데이터는 필요하지 않습니다.

예시: EIP-712 Mail

위의 "EIP-712 Mail"을 클릭하세요. 타입 데이터는 EIP-712 명세의 예제입니다. 도메인은 체인 1의 Ether Mail 버전 1이고 검증 컨트랙트는 0xcccc…cccc이며, Cow가 Bob에게 보내는 내용 "Hello, Bob!"의 Mail 구조체입니다. 도구는 도메인 구분자 0xf2cee375…, 구조체 해시 0xc52c0ee5…, 최종 다이제스트 0xbe609aee…를 보여 주는데, 이는 명세의 참조 구현이 출력하는 값과 정확히 같습니다. 이어서 첨부된 서명의 서명자를 복원합니다. "Hello, Bob!"에서 한 글자만 바꿔도 복원된 주소가 완전히 달라지며, 이것이 바로 구조화된 데이터에 서명하는 목적입니다.

비트코인 메시지 서명 읽기

base64 서명의 첫 바이트는 복원 id와 서명자가 의도한 주소 유형을 함께 인코딩합니다. 27–30은 비압축 키의 P2PKH, 31–34는 압축 키의 P2PKH, 35–38은 P2SH로 감싼 SegWit, 39–42는 네이티브 SegWit(bc1q)입니다. 도구는 키를 복원해 네 가지 주소 형식을 모두 도출하고, 입력한 주소와 일치하는 형식을 알려 줍니다. Electrum 등 여러 지갑은 bc1q 주소에 31–34 헤더로 서명하는데, 이 경우는 거부하지 않고 허용하되 메모로 표시합니다. 테스트넷 주소(m…, n…, 2…, tb1q…)는 접두사로 인식합니다.

주요 용도

지원하는 입력 형식

관련 도구: 메시지의 Keccak-256을 직접 계산하려면 해시 도구를, 주소 체크섬을 고치려면 EIP-55 변환기를, 서명이 사용된 트랜잭션을 디코딩하려면 이더리움 트랜잭션 디코더를 이용하세요.

자주 묻는 질문

personal_sign과 eth_signTypedData의 차이는 무엇인가요?

personal_sign(EIP-191)은 원시 메시지에 접두사 \x19Ethereum Signed Message:\n와 길이를 붙여 해시합니다. 지갑은 텍스트를 보여 줄 수는 있지만 그 의미를 설명하지는 못합니다. EIP-712는 타입이 지정된 구조체를 도메인(name, version, chainId, verifyingContract)과 함께 해시하므로, 지갑이 각 필드를 표시할 수 있고 한 dApp이나 체인에서 만든 서명을 다른 곳에서 재사용(리플레이)할 수 없습니다. 복원 연산은 같고 다이제스트만 다릅니다.

복원된 주소가 일치하지 않는 이유는 무엇인가요?

거의 항상 메시지 바이트가 다르기 때문입니다. 끝의 줄바꿈, Windows 줄바꿈 문자, 다른 유니코드 정규화, 또는 텍스트가 UTF-8이 아니라 hex 바이트로 서명된 경우입니다. EIP-712에서는 chainId, verifyingContract 또는 타입 정의가 다르면 도메인 구분자가 바뀌고, 따라서 서명자도 바뀝니다. 서명 자체가 잘못된 경우는 드뭅니다. 여기 표시된 해시를 코드가 계산한 값과 비교해 보세요.

v 값은 무엇을 의미하나요?

65바이트 이더리움 서명의 마지막 바이트는 복원 id입니다. 원래의 이더리움 인코딩에서는 27 또는 28, 최신 라이브러리에서는 0 또는 1이며, EIP-2098 컴팩트 서명에서는 s의 최상위 비트에 합쳐집니다. 모든 형식을 허용하며 복원 전에 정규화합니다.

Solana 검증에 RPC나 지갑이 필요한가요?

아니요. Solana signMessage는 접두사 없이 원시 바이트에 대한 일반 ed25519 서명을 생성하므로, 검증에는 메시지, 64바이트 서명, 32바이트 공개 키(지갑 주소)만 있으면 됩니다. 이 페이지는 RFC 8032 검증을 JavaScript로 구현합니다.

어떤 비트코인 서명 형식을 지원하나요?

Bitcoin Core signmessage, Electrum, Sparrow 및 대부분의 하드웨어 지갑이 생성하는 전통적인 65바이트 base64 형식(BIP-137)입니다. 헤더 바이트 27–42 뒤에 r과 s가 옵니다. 레거시, 중첩 SegWit, 네이티브 SegWit 주소를 지원하며, bc1q 주소에 레거시 헤더를 사용하는 Electrum의 방식도 처리합니다. BIP-322와 Taproot(bc1p) 서명은 다른 방식을 사용하므로 지원하지 않습니다.

이 도구로 서명할 수 있나요?

아니요. 서명에는 개인 키가 필요하며, 이 사이트는 키를 생성하거나 가져오거나 저장하지 않습니다. 메시지, 서명, 서명자의 주소 또는 공개 키 같은 공개 데이터로 서명을 검증할 뿐입니다.

서명이 서버로 전송되나요?

아니요. 모든 해싱(Keccak-256, SHA-256, SHA-512)과 곡선 연산(secp256k1 복원, ed25519 점 연산)은 브라우저에서 실행됩니다. 페이지는 로드된 후 네트워크 요청을 보내지 않습니다.