19 Aug 2026 · 4 min read

Your historian believes whatever it is told

security · scada · historian

Somebody disputes a number. A customer says the batch was out of spec, or a vendor says your pump was never run outside its curve, or an auditor wants to know what the flow was at four in the morning on a Tuesday in March.

You go to the historian, and there it is. Reading, tag name, site, timestamp. Argument settled.

Here is the awkward question. How does that row prove it came from that sensor?

The honest answer, on my own plant

I run a working estate — a few sites, a control room pair, a broker, a historian with a standby. I built it, so I know exactly what is in it, which makes it a fair thing to interrogate.

I published a message onto the plant's messaging backbone. The message was addressed as coming from one site, and the data inside it claimed to be from a different one.

The historian recorded the claim inside the message. The address it actually arrived on was discarded.

DELIVERED ASSevillediscarded on arrivalSAID ABOUT ITSELFRotterdamstored, permanently, unchecked
The envelope and the letter inside it name different senders. The filing clerk keeps the letter and bins the envelope, and the record is whatever the letter said about itself.

I did not need a password to do it. The reading is now in the database, looking exactly like every other row, and there is nothing in that row — or in any column next to it — that could tell you it was not produced by the site it names.

To be clear about what this is and is not: this was my own equipment, on an isolated network, and the point is not that anyone can walk in. The point is that once something is on the wire, the record has no way to argue with it.

Why it happens: everything in the middle speaks for itself

A reading does not travel from the sensor to the database. It gets handed over, repeatedly, and each box in the middle takes delivery and then sends its own message onward.

sensorsite collectormessaging backbonecollectorhistorianthe instrument is known hereeach box vouches for the one before itidentity is not carried forward — it is re-asserted, by something else, at every step
Each box takes delivery and sends its own message onward. After the first handover, every step is vouching for the step before it rather than for the instrument.

That is not a flaw somebody introduced. It is what those boxes are for. A protocol converter exists to convert. A broker exists to accept from many and deliver to many. A collector exists to collect. Every one of them takes something in, and emits something new under its own name.

The consequence is easy to miss: the sensor's identity does not survive the first handover. After that, every hop is vouching for the hop before it, and by the time a number reaches the database the only thing supporting it is a chain of boxes each saying "this is what I was given."

"But we use encrypted protocols"

This is the sentence I would most like to retire.

It is usually true, and it is answering a different question. Encryption on a link protects that link. It stops somebody reading the conversation between two boxes, and it proves each of those two boxes is who it says it is.

It says nothing at all about whether the reading inside was produced by the instrument whose name is on it.

sensorcollectorbackbonehistorianencrypted · this link is protecteddid this reading come from that instrument? — unanswered
The protected span and the span you care about are not the same span. Both are worth having; usually only the shorter one is present.

An encrypted link with an unverified payload is a sealed envelope with an unsigned letter inside. The courier is beyond reproach. The contents are anybody's guess.

That distinction — protecting the journey versus proving the origin — is the whole of this piece. Most plant architectures do the first thoroughly and the second not at all, and the gap is invisible because everything works perfectly until somebody disputes a number.

What else falls off on the way

While I was looking, I compared what four different paths into the same database actually record.

The older ones kept two things the newer ones dropped. One is quality — the instrument's own statement about whether it trusted its reading. The other is the difference between when something happened and when it was written down.

the oldest path
valuewhen it happenedwhen it landedquality
the next one built
valuewhen it happenedwhen it landedquality
a newer path
valuewhen it happenedwhen it landedquality
the newest path
valuewhen it happenedwhen it landedquality
without quality, a sensor fault and a real excursion look the same for ever
Four routes into the same database, oldest first, showing what each one still carries. Nobody decided to discard the last two columns; each new path was built to move a value, and a value is what it moves.

Both of those disappeared as the plumbing got more modern. Nobody decided to discard them; each new path was built to move a value from A to B, and the value was the obvious thing to carry. Quality is what tells you a reading was a sensor fault rather than a process excursion. Without it, a bad number and a real number look identical for ever.

What I would check on Monday

None of this needs a purchase, and most of it is a question rather than a project.

Pick a row in your historian and try to prove where it came from. Follow it back hop by hop. The first hop where the answer is "because that is what arrived" is where provenance ends. It is usually earlier than people expect.

Ask what happens if two things claim to be the same site. In a lot of systems the answer is that the later one simply overwrites, or both are stored, and nothing anywhere notices the disagreement.

Check whether quality made it into the database. If your historian has no column for it, every bad reading in there is indistinguishable from a good one.

Ask whether "encrypted" was ever meant to mean "verified". If a design relies on the second, someone should be able to point at where the checking happens.

None of this makes a plant insecure by itself. What it does is put a number on how much a historian row is actually worth as evidence — which is worth knowing before you use one to settle an argument.

The four paths, the schemas, the message capture and the exact line of configuration that decides which claim wins are in the lab notes. The other half of the same question — not where a reading came from but when, and why two paths into one database disagree about it — is here.

Keep reading

Newsletter

New essays, by email.

SCADA, cloud, AI, and the plant floor — a short email when something new is published. No noise, unsubscribe anytime.