The one-sentence version
Signing is the only "authorization" action in the cryptocurrency world: once the private key signs, the chain recognizes it. Therefore, the most important question before signing is: What exactly am I signing? "Blind signing" is signing a string of data that you cannot understand, which is equivalent to signing a blank check. The most prevalent theft method today, Permit / Permit2 signature phishing, involves tricking users into thinking they are "logging in" or "claiming an airdrop," when in reality, they are signing "permission for someone to transfer my tokens." The core principle of defense is called What You See Is What You Sign: a wallet must be able to fully decode the signature content and present it in human-readable terms; if it cannot be decoded, it should not be signed.
This article has three layers:
- Layer 1: The Intuition: Blank checks
- Layer 2: Real-World Use: Permit phishing, the Bybit incident, and "clear signing" in hardware wallets
- Layer 3:
eth_sign,personal_sign, EIP-712, and the structure of Permit
Layer 1: The Intuition
1.1 Blank Checks
Someone hands you a piece of paper with a string of gibberish on it: "0x8f3a...e21c, please sign to confirm." You sign it.
Later, you find out that this gibberish translates to: "I hereby agree to grant the transfer rights of all USDC in my account to 0xBad... ."
This is blind signing. The signing algorithm itself has no issues; the problem is that you do not know what you are signing.
1.2 Why Off-chain Signatures Are More Dangerous
Many people assume that "as long as you don't send a transaction or spend gas, there is no risk." However, there is a type of signature that is off-chain and costs nothing, yet can be taken by others and executed on-chain:
- You sign a Permit message, and the website displays "Signature successful, claiming your airdrop."
- The attacker takes your signature, submits their own transaction, authorizes your tokens to themselves, and then transfers them away.
Throughout this entire process, no transaction request ever appeared in your wallet; there was only a single "signature."
Layer 2: Real-World Use
- Permit / Permit2 phishing: Annual reports from on-chain security firms show that signature-based phishing is already one of the largest sources of losses for cryptocurrency users, with single victims losing tens of millions of dollars in individual cases. Common pretexts include: claiming airdrops, verifying wallets, free mints, and "signing in."
- Bybit (2025): The signer saw transaction data on the hardware wallet that could not be directly understood, leaving them to rely solely on the website's display, which had been tampered with (see "The Bybit Incident and Frontend Integrity"). In the aftermath, there has been unprecedented industry demand for "hardware wallets must clearly display multi-sig transaction content."
- Hardware wallet "clear signing": Manufacturers like Ledger and Trezor are promoting the direct display of decoded transactions on device screens, such as "Authorize Uniswap to use 1000 USDC, valid until [date]," rather than a string of hexadecimal code.
- Wallet security prompts: MetaMask, Rabby, and others display prominent warnings for Permit-type signatures and parse out the spender (the authorized party) and the allowance.
Layer 3: Principles and Engineering
3.1 Ethereum's Various Signing Methods
| Method | What is being signed | Risk |
|---|---|---|
eth_sign |
Any 32-byte hash | Highest: This hash could be the hash of a transaction, which the user cannot identify at all. Mainstream wallets have disabled this by default. |
personal_sign |
A message with a fixed prefix "\x19Ethereum Signed Message:\n" + length |
The prefix ensures it cannot be a transaction. It is safe when signing readable text; it remains blind signing when signing raw hexadecimal. |
eth_signTypedData_v4 (EIP-712) |
Structured data with a domain (app name, chain ID, contract address) | Wallets can parse and display it, but the user must actually understand it. |
eth_sendTransaction |
A transaction | The wallet will display the to, value, and data, but the data requires decoding. |
3.2 The Structure of EIP-712
{
"domain": { "name": "USD Coin", "version": "2", "chainId": 1,
"verifyingContract": "0xA0b8...eB48" },
"primaryType": "Permit",
"message": {
"owner": "0xYourAddress",
"spender": "0xAttackerAddress",
"value": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
"nonce": 0,
"deadline": 1893456000
}
}
Translated into human language: "I allow 0xAttackerAddress to spend all my USDC from now until January 1, 2030."
In this case, the astronomical number value is , meaning "unlimited allowance" (see "Unlimited Allowance"). Once signed, anyone can submit this signature to the USDC contract's permit function, and the authorization will be recorded on-chain; subsequently, the spender can call transferFrom to transfer the funds.
3.3 Permit2
Permit2, introduced by Uniswap, is a universal authorization contract: a user first performs an on-chain authorization (usually unlimited) for Permit2, and thereafter, various applications only need the user's signature to move the tokens. This provides a better user experience, but it also means: a single fraudulent signature can move all the tokens you have authorized to Permit2.
3.4 Engineering Principles of "What You See Is What You Sign"
- Do not support
eth_sign, and do not usepersonal_signfor raw hexadecimal; - Only sign content that can be fully decoded: transaction
calldatamust parse out the function name and parameters; EIP-712 must identify the spender, allowance, and expiration; - If it cannot be decoded, reject it, rather than "displaying raw data for the user to judge themselves" (see "Fail-closed");
- Display the most prominent warning for authorization-type signatures: "This is equivalent to giving your assets to X";
- Signature requests must be triggered directly by a user's click; they must never pop up automatically when a page loads;
- For multi-sig wallets, the signer must be able to decode the transaction independently of the webpage (on the hardware wallet screen or using another tool), such as checking whether the
operationfield is a dangerousdelegatecall.
Summary
| Layer | Key points |
|---|---|
| Intuition | Blind signing = Signing a blank check |
| Reality | Off-chain signatures cost no gas, yet can be used to transfer assets on-chain |
| Technology | Disable eth_sign; EIP-712 is parsable, but users must still understand the spender and allowance |
| Principle | What You See Is What You Sign: If it cannot be decoded, do not sign; hardware wallets must display clearly |