Search Psychevus

12 results available.
↑ ↓ to navigate ↵ to open · esc to close
Back to writing

An email’s headers can lie. Its signature is harder to fake.

Written by

Published · Updated

Open the source of almost any email and near the top you’ll find a line like Authentication-Results: mx.google.com; dkim=pass; dmarc=pass. It looks like proof. It is really a note one mail server leaves for the next, and nothing stops a sender from writing a fake one further down the message.

The payment check on this site used to take that line at its word. I wanted it to look at the evidence underneath instead.

IN DETAIL

The part you can check

That evidence is the DKIM signature: a header the sending domain’s mail system adds, holding a hash of the body and a signature over a list of headers, made with a private key only that system has. The matching public key is published in DNS, where anyone can fetch it.

So anyone with the full message can redo the work. Hash the body, rebuild the signed headers, check the signature against the published key. If it passes, a mail system holding that domain’s private key signed this text, and the signed parts haven’t changed since. The header analyzer now does this in your browser. Only the signing domain and the name of its key are looked up; the message stays on your machine.

IN DETAIL

What a pass doesn’t cover

Two gaps are easy to miss. A signature only covers the headers it lists, and some senders leave Reply-To out. Then the reply address can be changed without breaking anything, which is exactly what a payment fraud needs. The other is the l= tag, which signs only the first part of the body. Anything added after that point, say a P.S. with different bank details, still passes.

The checker reports both. In the payment check, an unsigned tail on a bank-change email is enough to say stop.

Three more things a valid signature doesn’t settle on its own. A signer can set an expiry (x=); once it has passed, the signer asks you not to rely on the signature, so the checker marks it expired instead of passing it. Without an expiry, an old genuine email can simply be sent again and still verify. A valid signature also vouches for the From address only when the two line up the way that domain’s DMARC policy asks: some domains require the exact name (adkim=s), not just the same organisation, and the checker now looks that policy up. And a message with two From lines gets no vouching at all, because the signature can cover one while your mail program shows the other.

And a pass says nothing about who was typing. Much of the costliest supplier fraud comes from a real mailbox someone has broken into, and those messages are signed like any other. The signature narrows the question. The phone call to a number you already had answers it.

IN DETAIL

A failed check isn’t proof of forgery

Copying a message out of a mail program can change it: line endings, a re-encoded attachment, a client that tidies up whitespace. So when a signature doesn’t verify, the tool says it couldn’t confirm the message, not that the message is fake. That is less dramatic, but it is what the evidence supports.

If you’d rather see it than read about it, there is a Lab instrument that signs a sample bank-change email in your browser and lets you tamper with it. Change the account number, reword the subject, point the reply address somewhere else, and watch which check breaks.

Updated 10 November 2026: this note’s title used to say a signature can’t lie. That overstated it. A valid signature can belong to an old message sent again, or fail to vouch for the From address at all, and the checker now reports expiry, strict alignment and duplicate From lines separately.

Sources & further reading

Have a question? Write to me.

Short messages are fine.

Start a conversation
YOUR VISIT, YOUR CHOICE

Privacy, by intention.

You decide what stays on your device. You can change your choice at any time.

Essential

Saves your privacy choice. Administrator sign-in uses a secure session cookie.

Always on
Full privacy notice ↗