Consumer Wallet Identifier-Based Lookup Elimination Automation: A Tax ID Is Not a Secret

An identifier that is easy to know is not the same thing as a password
A lookup form built around "enter your tax ID or phone number to see your balance" treats that value as if only the rightful owner could produce it — the same assumption a password rests on. A Brazilian tax ID does not carry that property: it is printed on receipts, held in ordinary business records, and has appeared, like countless other identifiers, in data breaches unrelated to the business asking for it. A phone number is even more freely known. Building a lookup around either one is building a security boundary out of information that was never designed to be secret in the first place — and the fix a team reaches for first, rate-limiting the endpoint, raises the cost of guessing at scale without doing anything for the specific, targeted case, which is exactly the case that matters when the value being guessed is not actually hidden from anyone in particular.
How the underlying problem shows up before you fix it
A public-facing lookup accepts an identifier (a tax ID, a phone number, an account number) that is not, and was never designed to be, a secret only the account holder possesses.
The lookup query compares the submitted value against MULTIPLE different columns (here: a tax-ID field, a generic "document" field, a phone field, and a messaging-app field) without distinguishing between them — meaning any one of several different, all-freely-knowable identifiers opens the same result.
Rate limiting is applied to the lookup and genuinely raises the cost of scraping it at volume — while doing nothing for a single, targeted attempt against one already-known person, which a rate limit cannot distinguish from an ordinary customer checking their own balance.
The application continues to request the sensitive identifying column from the database even where it is not the primary key of the actual security decision — meaning the column's mere presence in a query is itself part of the exposure, independent of what the application does with it afterward.
The lookup responds identically (same fields, same format) whether the person asking is the account holder or a stranger who happened to know or guess the identifier — because the system has no way to distinguish the two once the identifier itself is presented.
How a lookup built on a public identifier became a credential no browser ever mishandles
Centriu Loop's consumer-facing portal let a customer check their own cashback balance without installing an app or creating an account — a genuine convenience, built around a public form asking for a tax ID or phone number. The query behind that form checked the submitted value against several different customer-record columns without distinguishing which kind of identifier had actually been entered, so a tax ID, a generic "document" value, a phone number, or a messaging-app number all opened the identical result: the customer's name, their current balance, and their purchase history.
The defect was not the convenience — it was treating a widely-known identifier as though it functioned as a secret. A tax ID is printed on receipts a customer might discard in public, kept in a store's own records, and has surfaced, like countless personal identifiers, in data breaches entirely unconnected to Centriu Loop or to the business using it. None of that makes the tax ID Centriu Loop's own security failure to fix at its source — but building a balance lookup around it, with no additional proof of ownership required, extended that pre-existing public knowledge directly into account access. Rate limiting the lookup by IP address was a real, working defense against one specific threat — someone with a long list of identifiers, scraping the lookup at scale — but it did nothing for the threat that matters more in practice: a single person targeting one specific, already-identified individual, submitting one value, exactly once, with no volume for a rate limit to ever notice.
The fix replaces the lookup entirely rather than trying to add a second factor on top of it. Each consumer now receives a 192-bit credential, generated once. The database stores only a SHA-256 hash of that credential — the plaintext value exists for exactly one moment, in the response that first issues it, and is never written anywhere in a form the database itself could disclose. The credential travels to the consumer as a link whose secret portion lives in the URL fragment — the part of a web address that follows a `#` character, which every modern browser is specifically designed to keep local and never transmit to any server, including Centriu Loop's own. The consumer-facing page reads that fragment, exchanges it for a short-lived session token, and then deliberately erases the fragment from the visible address bar before making its very first request to any server — specifically so that a slow network response, a browser crash, or simply closing the tab partway through does not leave the raw secret sitting in browser history where it could later be read by anyone else with access to that device. What remains after that exchange is an ordinary, short-lived HttpOnly cookie, valid for fifteen minutes, which cannot be read by page scripts and expires or can be explicitly revoked, immediately invalidating every session it had opened.
A further, deliberate hardening: the application stopped requesting the tax-ID column from the underlying customer-record table for this entire flow — not merely reading it and declining to display it, but never asking the database for it in the first place. Not requesting a sensitive column is a stronger guarantee than requesting and discarding one, because it removes the column from the flow's own reachable surface entirely, rather than depending on every future line of code in that flow to keep discarding it correctly.
What is actually built today
The consumer portal no longer accepts a tax ID, phone number, or any other publicly-knowable identifier as a means of looking up a balance — that lookup form and its underlying query no longer exist.
Each consumer holds a 192-bit credential, generated once; the database stores only its SHA-256 hash, never the plaintext value, at any point after issuance.
The credential is delivered as a link whose secret lives in the URL fragment, a part of a web address no browser transmits to any server — eliminating an entire class of exposure (server access logs, proxy logs, referrer headers) that a URL query parameter or path segment would carry.
The visible address bar is cleared of the secret fragment before the page makes its first network request, specifically so an interrupted page load does not leave the raw credential sitting in browser history.
The exchanged session is a short-lived (15-minute), HttpOnly cookie, invisible to page-level scripts and immediately invalidated, along with every session it opened, if the underlying credential is revoked.
The application no longer requests the tax-ID column from the customer-record table for this flow at all — the column's absence from the query is itself part of the fix, not merely a decision about what to do with a value once read.
A receipt in a public trash can, and what it used to be worth (illustrative framing of the actual fix)
Before the fix, a discarded store receipt showing a customer's tax ID — a routine, unremarkable piece of paper — was, on its own, enough for anyone who found it to look up that customer's cashback balance and full purchase history through Centriu Loop's public portal, with no further verification of any kind. After the fix, the identical receipt discloses nothing usable against the portal: balance access requires the 192-bit credential issued directly to that consumer, which never appears on a receipt, in a store's records, or anywhere a tax ID or phone number routinely surfaces.
What changes operationally
Centriu Loop's consumer balance portal no longer grants access based on a publicly-knowable identifier of any kind — access now requires a 192-bit credential issued directly to the consumer, delivered and exchanged in a way specifically designed so the secret itself is never sent to a server, never persisted in the database in readable form, and never left exposed in browser history by an interrupted page load.
When this is not the right fit
This automation governs the internal identity mechanism behind Centriu Loop's own consumer-facing balance portal — it does not change how a business's own staff access customer records through the operator dashboard (a separately authenticated, logged-in flow), and does not affect what identifying information a business collects from its own customers for its own records outside of this specific public lookup.
A publicly-known identifier as a lookup key vs. a credential minted for exactly one purpose
Using an identifier a business already has on file — a tax ID, a phone number, an account number — as the key to a public lookup is a natural first design, because the value is already there and the business already associates it with the right customer. The risk is specific and easy to overlook precisely because the identifier IS legitimately useful for record-keeping: an identifier good enough to find the right customer internally is not automatically good enough to prove, to a public-facing form, that the person asking IS that customer. A credential minted specifically and only for this one purpose — never printed on a receipt, never stored in plaintext, never reused for any other function — carries no such ambiguity.
Related systems
Main system: Centriu Loop.
What it does NOT do
- Does not change how a business's own logged-in staff look up a customer's balance through the operator dashboard — this fix is specific to the separate, public, unauthenticated consumer portal.
- Does not require a consumer to create an account, choose a password, or install an app — the replacement credential is delivered as a link, preserving the original no-login convenience while removing the identifier-based exposure.
- Does not retroactively identify whether any specific consumer's balance was looked up by someone other than themselves before this fix shipped — a business with that concern would need its own historical access-log review, which this fix does not provide.
- Does not change what identifying information a business collects and stores about its own customers for its own records — it changes only what a consumer must present to the public balance-lookup flow specifically.
- Does not overlap with the organization-slug enumeration fix or the rate-limiter race-condition fix — both are separate, independent mechanisms from the same source commit, covered on their own pages.
Security and governance
Centriu Loop's consumer balance portal grants access exclusively through a 192-bit credential issued once per consumer, stored only as a SHA-256 hash, delivered via a URL fragment no browser transmits to any server, and exchanged for a short-lived, HttpOnly session — never through a tax ID, phone number, or any other identifier a consumer did not receive directly from Centriu Loop for this specific purpose. Any personal data referenced remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.
Pricing and contracting
Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
Was this actually exploitable, or a theoretical concern?
Measured directly from the fix's own account: the lookup compared a submitted value against multiple different customer-record columns without distinguishing them, so a tax ID, a generic document value, or a plain phone number all opened the identical result — and none of those values function as a secret in the first place.
Why wasn't rate limiting on the old lookup enough?
Rate limiting raises the cost of scraping a lookup at volume — checking many identifiers quickly. It does nothing for a single, targeted attempt against one already-known person, submitted once, which produces no volume for a rate limit to notice.
How does a consumer access their balance now, if not by tax ID or phone?
Through a personal link issued directly by Centriu Loop, containing a 192-bit credential. The secret lives in the URL fragment (never sent to any server) and is exchanged for a short-lived session the moment the page loads.
What happens if a consumer's link is compromised?
The credential can be revoked directly, which immediately invalidates it and every session it had opened — and a new link with a fresh credential can be issued in its place.
Does this affect how a business's own staff look up a customer's balance?
No — staff access goes through a separately authenticated, logged-in operator dashboard, which this fix does not change.
What does Centriu Loop cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Loop protects consumer balance access
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.
