A crypto wallet asks you to sign a message. The website says it is needed to continue, and the wallet shows a confirmation button. Does signing simply prove that you control an address—or could it authorize someone to use your tokens?
Both are possible, depending on the exact message and the system that interprets it. A legitimate sign-in request can establish a website session without moving crypto. A different signature can give a smart contract permission to change a token allowance or execute an authorized transfer later. Neither outcome is determined by the word “Sign” alone.
Understanding wallet signatures means separating three things: what data you sign, who can verify it, and what the verifier is allowed to do with it.
- A wallet signature proves control, but its meaning comes from the message
- Three wallet requests that can look deceptively similar
- When signing is just a way to log in
- When a signature can authorize token spending
- Permit2 adds another kind of signature-based permission
- Why readable typed data is helpful—but not proof of safety
- A hypothetical example: two signatures, two different outcomes
- What a wallet signature does not automatically do
- Five questions to ask before signing
- What if you already signed something suspicious?
- The rule: understand the authority before approving the signature
A wallet signature proves control, but its meaning comes from the message
A self-custody wallet uses cryptographic keys to control an account. The private key is used to generate signatures, while other parties can verify that a particular signature is valid for the relevant account and message.
For a conventional Ethereum externally owned account, the wallet signs a cryptographic digest derived from the transaction or message. The private key itself is not sent to the website.
This is why signatures are useful: an application can verify authorization without requiring the user to reveal the secret that controls the account.
But verification answers only part of the question.
A valid signature proves that the required signing authority approved the signed data. It does not automatically establish that the website’s explanation was truthful, that the requested action is safe, or that the user understood its consequences.
For example, a service might interpret a signed message as proof of identity. A token contract might interpret another signed message as authorization to change a spending allowance.
The underlying cryptographic idea is similar. The consequences are different because the messages and verification rules are different.
Core principle: A signature is evidence of authorization for specific data. To understand its risk, you must understand what that data authorizes.
Three wallet requests that can look deceptively similar
A wallet interface may present a confirmation flow for several distinct actions. On Ethereum-compatible systems, three common categories are ordinary message signing, structured-data signing, and transaction signing.
| Request type | What it does | Possible consequence |
|---|---|---|
| Sign a message | Produces a signature over specified data | May authenticate an account or authorize another application-defined action |
| Sign typed data | Signs structured fields using a defined encoding scheme | May authorize an order, permit, or another operation interpreted by a verifying contract |
| Sign a transaction | Authorizes a blockchain transaction that can be submitted to the network | Can transfer assets, execute a smart contract, or change blockchain state if included successfully |
These categories are not completely separate in every wallet interface, and the exact wording varies by application. They are useful distinctions because a signature can exist before any blockchain transaction occurs.
The ERC-191 signed-data standard defines formats that distinguish signed messages from ordinary Ethereum transactions. EIP-712 adds a standard method for signing structured data, making it possible for wallets to display meaningful fields rather than only opaque bytes.
Neither standard guarantees that a particular application will use the signature safely.
When signing is just a way to log in
Imagine a website that lets visitors sign in using an Ethereum wallet rather than a password.
The site needs to establish that the person requesting a session controls the claimed wallet address. It can ask the wallet to sign a message containing information associated with that login request.
The Sign-In with Ethereum specification, ERC-4361, defines a standardized format for this process.
A compliant message includes information such as the requesting domain, wallet address, URI, chain ID, nonce, and issue time. Optional fields can include an expiration time and additional resources.
The nonce is especially important. It helps a properly implemented service prevent an old signed login message from being reused to establish another session.
The normal sequence works like this:
- The website prepares a sign-in request with the appropriate domain and a fresh nonce.
- The wallet presents the message to the user.
- The user signs the intended authentication message.
- The website verifies the signature and the required message fields.
- If verification passes, the website can create a session for the account.
In this model, signing establishes application-level authentication. It does not, by itself, modify the balance of the wallet’s tokens.
There are still security consequences. A signed authentication message can be valuable to an attacker if an application mishandles nonces, domains or session validation.
And users must not assume every website asking them to “sign in” has implemented ERC-4361 correctly.
Useful distinction: A legitimate authentication signature is intended to establish identity or a session. That is different from granting a token-spending permission.
When a signature can authorize token spending
Ethereum applications also use signatures to authorize actions that will be enforced by smart contracts.
One example is ERC-2612, an extension supported by certain ERC-20 tokens. It introduces a function called permit.
With a conventional ERC-20 approval, a token holder submits an onchain transaction to give a spender permission to use a specified amount of tokens.
With an ERC-2612 permit, a supporting token can accept a signed authorization that updates the allowance when someone submits it to the token contract.
The owner does not necessarily have to submit the transaction personally. A different party can provide the signature and pay the network fee.
The ERC-2612 specification defines signed parameters that include the owner, spender, value, nonce and deadline.
These fields have distinct functions:
- Owner: The account granting permission.
- Spender: The address receiving spending authority.
- Value: The permitted token amount.
- Nonce: A value used to prevent reuse of the same authorization after it has been consumed.
- Deadline: The final time at which the permit can be accepted.
Once a valid permit is submitted, the token contract can record an allowance. The authorized spender may then be able to transfer tokens within that allowance, subject to the token contract’s rules and the account’s available balance.
The signature alone does not make every asset in the wallet accessible. It authorizes the operation defined by the relevant contract and message.
However, that authorization can be significant.
An important subtlety is that the ERC-2612 deadline restricts when the signed permit may be submitted. It does not automatically make the resulting ERC-20 allowance expire at the same deadline.
Our existing article on ERC-20 token approvals explains how spending allowances work and why unused permissions may remain relevant after an application interaction ends.
Permit2 adds another kind of signature-based permission
Not every token implements ERC-2612. Other systems can use separate contracts to manage permissions.
Uniswap’s Permit2 is an example. It allows compatible workflows to use signed authorizations after the wallet has granted the Permit2 contract an appropriate underlying ERC-20 allowance.
Its official documentation distinguishes two models:
- SignatureTransfer: A signature authorizes a nonce-scoped transfer that can be used once.
- AllowanceTransfer: Spending permissions can be set with an amount and expiration for the permitted spender.
The details differ from a token’s native ERC-2612 implementation. This is why “permit signature” is a category of authorization, not a promise that every permission behaves identically.
For the wallet user, the practical lesson is consistent: an offchain signature may later become input to an onchain operation.
The fact that signing does not require the user to pay gas at that moment does not establish that the request is harmless.
Why readable typed data is helpful—but not proof of safety
EIP-712 addresses a usability problem. A complex authorization should be represented with defined fields so that a compatible wallet can present what the user is being asked to sign.
Those fields may include a domain name, chain ID, verifying contract, token address, spender, amount, nonce or deadline, depending on the application.
Domain separation is designed to distinguish signatures intended for different verification contexts.
But EIP-712 explicitly does not provide replay protection on its own. Applications must implement the protections required by their authorization rules.
Structured data can therefore be easier to inspect without being automatically trustworthy.
A malicious website can request a perfectly well-formed signature whose underlying purpose is harmful. A legitimate application may request a powerful permission that is broader than the user’s intended action.
It is also possible for a wallet to display technical fields that an ordinary user cannot interpret confidently. When the requested authorization cannot be understood, the safer response is to decline it until its purpose and scope can be independently verified.
Security principle: Readable signing data improves transparency. It does not replace checking the identity of the requesting application or the consequences of the authorization.
A hypothetical example: two signatures, two different outcomes
Hypothetical example: Alex uses a self-custody Ethereum wallet that holds 200 units of a fictional ERC-20 token. Assume the token supports ERC-2612, and no unusual transfer restrictions apply.
First, Alex visits a legitimate website and signs a correctly formed Sign-In with Ethereum request. The message identifies the expected domain and contains a fresh nonce.
The website verifies the message and creates a login session. Alex’s token balance and onchain spending allowances remain unchanged by that authentication process.
Later, Alex visits a different website that claims to offer a wallet verification check. It asks for a signature but presents an authorization granting an unfamiliar spender an allowance of 1,000 tokens.
If Alex signs that valid permit and the other party submits it before its deadline, the supporting token contract can record the requested allowance.
Although Alex currently holds only 200 tokens, the allowance can be larger than the present balance. Subject to the remaining permission, future deposits into that wallet could also be exposed.
The spender would still need to perform an authorized onchain transfer. The act of signing is not itself proof that a transfer has occurred.
But the signed permit can supply the authority required for that later action.
The original website’s explanation—”verify your wallet”—does not change what the underlying signed data means.
Under the first set of conditions, the signature establishes a session. Under the second, it can create spending authority.
Practical takeaway: Do not judge a signature by the button’s label. Judge it by the data being signed and the operation that can consume it.
What a wallet signature does not automatically do
It is important not to replace one misconception with another.
Every wallet signature is not a token approval. A correctly formed authentication message does not automatically grant a spender an ERC-20 allowance.
Likewise, giving a website a signature does not inherently reveal the wallet’s seed phrase or private key. Those secrets remain distinct from the signature itself, assuming the wallet and signing environment are functioning correctly.
Whether a signature can trigger an asset transfer depends on the protocol, the signed data, contract verification rules and any required existing permissions.
A transaction signature and a message signature also have different roles. A signed Ethereum transaction can be submitted to the network for execution. A signed message may remain offchain and be interpreted later by another system.
Signature-based systems are not inherently malicious. They enable useful features such as wallet authentication and more flexible token interactions.
The risk arises when the person signing cannot distinguish the intended operation from the authorization actually being granted.
For a more fundamental explanation of signing authority, see how crypto wallets use keys, addresses and transactions. Wallet recovery secrets have a different role, explained in our guide to seed phrases and wallet recovery.
Five questions to ask before signing
A useful review process starts before looking at the technical fields. Identify what you are trying to accomplish, then check whether the wallet request matches that purpose.
- 1. Which website is asking? Verify the actual domain through a trusted route. Do not rely only on a logo, search advertisement or link in an unexpected message.
- 2. Is this authentication or spending authorization? Look for sign-in details versus fields such as token, spender, allowance, permitted amount or verifying contract.
- 3. What is the scope? Check the account, network, contract, amount, recipient or spender, and any validity period relevant to the request.
- 4. Can the signature be used later? A permit may be submitted by another party before expiration. Understand whether it creates persistent permission, a single-use authorization or only a website session.
- 5. Can you independently verify the request? If the wallet cannot explain the message, or the purpose differs from what the site claims, decline until you can verify it.
These questions do not guarantee safety. They are a method for identifying mismatches before granting authority.
They are particularly useful for requests that arrive unexpectedly. A website that demands a new signature to resolve a supposed emergency may be attempting to turn the user’s concern into an authorization opportunity.
What if you already signed something suspicious?
First, identify what kind of request you signed. An authentication signature, a standard token allowance and a pending signature-based permit require different responses.
If you signed a suspicious login message, stop using the untrusted site and investigate any session or account access that may have been created. The legitimate service may offer a way to invalidate sessions.
If you signed a token-spending authorization, determine which token, spender, contract and account are involved. Check whether the signature has been used and whether related onchain allowances exist.
For confirmed ERC-20 allowances, supported revocation methods may prevent future spending after the revocation transaction takes effect. That does not reverse transfers already completed.
For an unused offchain permit, simply disconnecting the website is not sufficient evidence that the authorization has been invalidated. The applicable contract may have nonce invalidation or other cancellation mechanisms, but these vary by permit implementation.
Where exposure is significant, use verified documentation and an established wallet security process rather than signing additional “recovery” requests from an unknown website.
MetaMask’s guidance on signature phishing describes how attackers obtain offchain authorizations that can later be used against a wallet. Its examples illustrate why checking only for a completed transaction immediately after signing can miss the relevant risk.
The rule: understand the authority before approving the signature
Wallet signatures are essential to how Web3 works. They let users prove account control, create authenticated sessions and authorize defined actions without handing applications their private keys.
The important distinction is what the receiving system can do with that proof.
A sign-in message may establish a session. A permit can enable token spending. A transaction can request an onchain state change. These operations should never be treated as interchangeable just because they end with the same wallet confirmation button.
Before signing, identify the requester, the exact action, the scope of authority and whether the signature can be used later. If those details are unavailable or conflict with your intended action, do not sign.
