Проверка криптоподписей

Вставьте сообщение, подпись и (необязательно) адрес, который якобы её создал. Инструмент восстанавливает подписанта Ethereum, проверяет подписи Solana ed25519 и Bitcoin BIP-137 и показывает все промежуточные хеши. Ничего не загружается на сервер, приватный ключ не используется.

Примеры:

Вычисляется в вашем браузере на JavaScript. Адреса никогда не загружаются на сервер и не сохраняются.

Что такое проверка подписи?

Инструмент проверки подписи принимает сообщение, цифровую подпись и публичный идентификатор (адрес или публичный ключ) и сообщает, действительно ли этот идентификатор создал подпись именно над этим сообщением. В Ethereum проверка выполняется через восстановление: secp256k1 позволяет вычислить публичный ключ подписанта из подписи и хеша сообщения, получить из него адрес хешированием и сравнить. В Solana (ed25519) и для форматов сообщений Bitcoin (SegWit и legacy) действует та же идея, но с другими правилами хеширования. Эта страница реализует все четыре соглашения, которые сегодня используют кошельки, — в браузере и только по публичным данным.

Поддерживаемые типы подписей

ТипСтандартПодписываемый дайджестКриваяРезультат
Ethereum personal_signEIP-191 (версия 0x45)keccak256("\x19Ethereum Signed Message:\n" + length + message)secp256k1Восстановленный адрес, отметка о совпадении, хеш сообщения
Типизированные данные EthereumEIP-712 (eth_signTypedData_v4)keccak256(0x1901 ‖ domainSeparator ‖ hashStruct(message))secp256k1Domain separator, хеш структуры, дайджест, восстановленный подписант
Solana signMessageRFC 8032 Ed25519SHA-512 внутри уравнения EdDSA, без префиксаed25519Действительна / недействительна
Подписанное сообщение BitcoinBIP-137 (Bitcoin Core signmessage)SHA-256d("\x18Bitcoin Signed Message:\n" + varint(len) + message)secp256k1Восстановленный ключ, производный адрес, совпадение

Как работает восстановление в Ethereum

Подпись ECDSA — это пара (r, s). Для 32-байтового дайджеста и идентификатора восстановления v существует не более двух возможных публичных ключей; v выбирает один из них. Инструмент вычисляет дайджест по выбранному стандарту, восстанавливает 64-байтовый публичный ключ, берёт последние 20 байт его хеша Keccak-256, получая адрес, и сравнивает его с ожидаемым адресом, если вы его указали. Поскольку адрес вычисляется, а не ищется, совпадение доказывает владение ключом в момент подписания; данные из блокчейна не нужны.

Разбор примера: EIP-712 Mail

Нажмите «EIP-712 Mail» выше. Типизированные данные — пример из спецификации EIP-712: домен Ether Mail версии 1 в сети 1 с проверяющим контрактом 0xcccc…cccc и структура Mail от Cow к Bob с содержимым «Hello, Bob!». Инструмент показывает domain separator 0xf2cee375…, хеш структуры 0xc52c0ee5… и итоговый дайджест 0xbe609aee… — ровно те значения, что выводит эталонная реализация из спецификации, — а затем восстанавливает подписанта приложенной подписи. Измените один символ в «Hello, Bob!», и восстановленный адрес изменится полностью: в этом и состоит смысл подписи структурированных данных.

Как читать подпись сообщения Bitcoin

Первый байт подписи в base64 кодирует и идентификатор восстановления, и тип адреса, который подразумевал подписант: 27–30 — P2PKH с несжатым ключом, 31–34 — P2PKH со сжатым ключом, 35–38 — SegWit, обёрнутый в P2SH, и 39–42 — нативный SegWit (bc1q). Инструмент восстанавливает ключ, выводит все четыре формы адреса и сообщает, какая из них совпадает с указанным вами адресом. Electrum и ряд других кошельков подписывают адреса bc1q с заголовком 31–34; такой случай принимается и помечается примечанием, а не отклоняется. Адреса testnet (m…, n…, 2…, tb1q…) распознаются по префиксу.

Типичные сценарии

Поддерживаемые форматы ввода

См. также: вычислите Keccak-256 сообщения самостоятельно с помощью инструмента хеширования, исправьте контрольную сумму адреса в конвертере EIP-55 или декодируйте транзакцию, в которой использовалась подпись, в декодере транзакций Ethereum.

Часто задаваемые вопросы

Чем personal_sign отличается от eth_signTypedData?

personal_sign (EIP-191) хеширует сырое сообщение с префиксом \x19Ethereum Signed Message:\n и его длиной; кошелёк показывает текст, но не может его пояснить. EIP-712 хеширует типизированную структуру вместе с доменом (name, version, chainId, verifyingContract), поэтому кошельки могут отобразить каждое поле, а подпись для одного dApp или одной сети нельзя повторно использовать в другой. Математика восстановления одна и та же; различается только дайджест.

Почему восстановленный адрес не совпадает?

Почти всегда потому, что различаются байты сообщения: лишний перевод строки в конце, окончания строк Windows, другая нормализация Unicode или текст был подписан как hex-байты, а не UTF-8. Для EIP-712 другой chainId, verifyingContract или определение типов меняют domain separator, а значит, и подписанта. Сама подпись редко бывает неверной; сравните показанные здесь хеши с тем, что вычислил ваш код.

Что означает значение v?

Последний байт 65-байтовой подписи Ethereum — идентификатор восстановления: 27 или 28 в исходной кодировке Ethereum, 0 или 1 в более новых библиотеках, а в компактных подписях EIP-2098 он упакован в старший бит s. Все варианты принимаются и нормализуются перед восстановлением.

Нужен ли для проверки Solana RPC или кошелёк?

Нет. Solana signMessage создаёт обычную подпись ed25519 над сырыми байтами, без префикса, поэтому для проверки нужны только сообщение, 64-байтовая подпись и 32-байтовый публичный ключ (адрес кошелька). Эта страница реализует проверку по RFC 8032 на JavaScript.

Какие форматы подписей Bitcoin поддерживаются?

Классический 65-байтовый формат base64, который выдают Bitcoin Core signmessage, Electrum, Sparrow и большинство аппаратных кошельков (BIP-137): байт заголовка 27–42, затем r и s. Поддерживаются адреса legacy, вложенный SegWit и нативный SegWit, включая привычку Electrum использовать legacy-заголовок для адресов bc1q. Подписи BIP-322 и Taproot (bc1p) используют другую схему и не поддерживаются.

Может ли этот инструмент что-то подписать?

Нет. Для подписи нужен приватный ключ, а этот сайт никогда не генерирует, не импортирует и не хранит ключи. Он только проверяет подписи по публичным данным: сообщению, подписи и адресу или публичному ключу подписанта.

Отправляется ли подпись на сервер?

Нет. Всё хеширование (Keccak-256, SHA-256, SHA-512) и арифметика на кривых (восстановление secp256k1, операции с точками ed25519) выполняются в вашем браузере. После загрузки страница не делает сетевых запросов.