서명 검증기란?
서명 검증기는 메시지, 디지털 서명, 공개 신원(주소 또는 공개 키)을 받아 그 신원이 정확히 그 메시지에 대해 실제로 서명했는지 알려 줍니다. 이더리움에서는 복원(recovery)으로 검사합니다. secp256k1에서는 서명과 메시지 해시로부터 서명자의 공개 키를 계산할 수 있으므로, 이를 해시해 주소를 얻고 비교합니다. Solana(ed25519)와 비트코인의 SegWit 및 레거시 메시지 형식에도 해싱 규칙만 다를 뿐 같은 원리가 적용됩니다. 이 페이지는 오늘날 지갑이 사용하는 네 가지 방식을 모두 공개 데이터만으로 브라우저에서 구현합니다.
지원하는 서명 유형
| 유형 | 표준 | 서명되는 다이제스트 | 곡선 | 출력 |
|---|---|---|---|---|
| 이더리움 personal_sign | EIP-191 (version 0x45) | keccak256("\x19Ethereum Signed Message:\n" + length + message) | secp256k1 | 복원된 주소, 일치 배지, 메시지 해시 |
| 이더리움 타입 데이터 | EIP-712 (eth_signTypedData_v4) | keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message)) | secp256k1 | 도메인 구분자, 구조체 해시, 다이제스트, 복원된 서명자 |
| Solana signMessage | RFC 8032 Ed25519 | EdDSA 방정식 내부의 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…)는 접두사로 인식합니다.
주요 용도
- Sign-In with Ethereum / 지갑 로그인: 백엔드에서 받아들이기 전에 클라이언트가 보낸 서명이 실제로 주장하는 주소의 것인지 확인합니다.
- Permit 및 Permit2 승인: dApp이 서명을 요청한 타입 데이터를 붙여넣어 서명에 실제로 묶이는 도메인, spender, deadline을 확인합니다.
- 주소 소유 증명: 거래소와 OTC 데스크는 입금 또는 출금 주소의 서명 메시지를 요구합니다. 신뢰하기 전에 여기서 검증하세요.
- 디버깅: 이 페이지가 보여 주는 해시를 사용 중인 라이브러리의 계산 결과와 비교해 접두사, 인코딩, chainId 오류를 찾습니다.
지원하는 입력 형식
- 이더리움 서명: v = 0, 1, 27, 28인 65바이트 hex 또는 64바이트 EIP-2098 컴팩트 서명. 0x는 있어도 되고 없어도 됩니다.
- 메시지: UTF-8 텍스트, 또는 서명자가 원시 바이트를 해시한 경우 hex 바이트. Solana는 base64도 지원합니다.
- Solana 서명: base58(Phantom과 Solflare가 반환하는 형식), base64 또는 hex. 공개 키는 base58 주소 또는 32바이트 hex.
- 비트코인 서명: signmessage가 생성하는 base64, 또는 같은 65바이트의 hex.
관련 도구: 메시지의 Keccak-256을 직접 계산하려면 해시 도구를, 주소 체크섬을 고치려면 EIP-55 변환기를, 서명이 사용된 트랜잭션을 디코딩하려면 이더리움 트랜잭션 디코더를 이용하세요.