Skip to content
Centriu
Centriu Vértice

Authentication Failure Classification and Anti-Enumeration Automation: Your Password Was Never the Problem

Centriu Vértice's login screen previously showed the identical message — "Email or password incorrect" — for any failure at all from its authentication provider, with no distinction between an actually-wrong credential, a rate limit, or the provider being unavailable. Measured directly: one real login attempt took 11.5 seconds and ended with the authentication provider itself reporting a timeout (`context deadline exceeded`, surfaced as an HTTP 504) — and the screen told that person their password was wrong. Their password was correct. The fix classifies every possible outcome by reading the most reliable signal available first (an HTTP status code before a provider-specific code, a code before free-form text, since a rate limit can arrive with no code at all and a genuine service failure can arrive with wording that reads exactly like a rejected credential), producing four honest, distinct messages instead of one. The one for a genuine service failure or timeout says so explicitly, and states plainly that the password was NOT rejected — the specific piece of information the previous single message never gave, which had been sending people who did nothing wrong toward changing a password that was never the actual problem. A pre-existing, deliberately preserved protection continues unchanged throughout: an email address that has never been registered and one that exists but was given the wrong password produce the identical message, so probing which email addresses exist on the platform gains an outside observer nothing at all.
11.5s timeout, "wrong password"
Anti-enumeration preserved
Login failure message screen
Your password was never the problem.

One fixed sentence for every failure is simple, until failures stop being the same kind of thing

Mapping every possible failure from an external, third-party dependency into a single, fixed, user-facing message is a common and often deliberately protective simplification — for a login screen specifically, it also serves a real security purpose: never confirming to an outside caller exactly why an attempt failed, so a wrong password and a nonexistent account cannot be told apart by probing. The tradeoff sits underneath that simplification: an external authentication provider can fail for reasons that have nothing to do with the credential submitted at all — an outage, a timeout, a rate limit reached — and folding every one of those into a sentence specifically shaped like "your credential was wrong" tells the person nothing true about what actually happened, at exactly the moment they most need an accurate signal for what to do next.

How the underlying problem shows up before you fix it

A login (or any credential-check) flow maps every kind of failure from an external authentication call into one fixed, credential-shaped message, regardless of whether the actual cause has anything to do with the credential submitted.

A genuine service failure or timeout from an authentication provider is measured, directly, to produce the identical user-facing message as an actually-incorrect password — with no distinguishing signal anywhere for the person experiencing it.

A misleading "your credential was wrong" message, for a failure that had nothing to do with the credential, sends the affected person toward the one action that seems logical (changing the credential) — which fails again, for the identical underlying reason, reinforcing the same wrong diagnosis rather than revealing it.

Improving the honesty of a failure message risks breaking a genuinely important, pre-existing security property (that a nonexistent account and a wrong password read identically) if the more detailed classification is not deliberately designed and tested to preserve that specific invariant.

Structured logs intended to help diagnose authentication failures capture the raw, provider-supplied error text, which can itself echo back exactly what a caller submitted — turning a diagnostic log into an unintended, sensitive record.

How a single fixed sentence became four honest ones, without weakening a real protection

Centriu Vértice's login flow reads a fixed piece of code that, before this fix, handled every possible outcome from the underlying authentication call the identical way: any error at all — regardless of its actual cause — produced the exact sentence "Email ou senha incorretos" (email or password incorrect). Measured directly against a real, slow authentication attempt: a login took 11.5 seconds, and the authentication provider itself reported a timeout — `context deadline exceeded`, surfaced through the transport layer as an HTTP `504`. The person attempting to log in was told their password was wrong. Their password was correct; the provider itself had simply failed to respond in time.

The fix replaces that one fixed mapping with a dedicated classification function that reads the most reliable signal available FIRST, specifically because different failure modes surface their true nature through different, sometimes-absent signals: an HTTP status code is checked before a provider-specific error code, and a code is checked before any free-form text, because a rate-limit response can arrive with no distinct error code attached at all, and a genuine service failure can arrive carrying wording that, read on its own, sounds exactly like a rejected credential. Reading signals in the wrong order, or trusting free text as if it reliably named the true cause, would reproduce a version of the same original problem in a more complicated form.

Four distinct outcomes now exist where one used to. An actually-invalid credential, an unrecognized account, or an unconfirmed email address all still produce the same, deliberately unchanged message — "Email or password incorrect" — preserving exactly the ambiguity a login screen needs for this specific case. A rate limit produces its own distinct message naming the actual situation (too many attempts in a short time). Any other authentication-related error with no clear match produces a generic, honest "could not complete login right now" rather than being folded into the credential-shaped message by default. And a genuine service failure or timeout — the exact case measured at 11.5 seconds — now produces a message stating PLAINLY that the password was not rejected, and to try again shortly: the one specific fact the previous single sentence never communicated, which had been quietly sending people who had done nothing wrong toward changing a password that was never actually the problem.

The fix's own account is explicit that the pre-existing anti-enumeration protection was a deliberate design constraint carried through this change, not an incidental side effect: an email address that has never been registered on the platform and an email address that exists but was paired with an incorrect password produce the exact same message under the new classification, exactly as they did before — so an outside party attempting to learn which email addresses are registered by observing which produce a different response gains nothing at all from the more detailed classification now available for OTHER failure types. A dedicated, specific test exists whose only purpose is to fail if a future change to this code accidentally breaks that one invariant.

A structured, internal log now records each authentication attempt's outcome with a correlation identifier, the measured latency, and the classified failure type — deliberately never the raw, provider-supplied error message itself, specifically because that raw text can echo back exactly what the caller submitted in the original request, which would turn an operational diagnostic log into an unintended record of submitted, potentially sensitive input.

What is actually built today

Centriu Vértice's login flow classifies every authentication failure into one of four distinct outcomes, reading the most reliable available signal first (HTTP status before provider code, code before free text) rather than defaulting every unrecognized failure into the credential-shaped message.

A genuine service failure or timeout produces a message stating explicitly that the password was NOT rejected — replacing a previous default that told the same person their credential was wrong for a failure that had nothing to do with it.

The pre-existing anti-enumeration protection is deliberately preserved: an unrecognized email address and an existing one paired with a wrong password continue to produce the identical message, confirmed by a dedicated test built specifically to fail if this invariant is ever broken.

A rate-limit failure now produces its own distinct, honest message rather than being folded into either the credential-shaped message or a generic failure.

Structured authentication logs now carry a correlation id, measured latency, and the classified failure type — and deliberately exclude the raw provider error message, which could otherwise echo back exactly what a caller submitted.

An 11.5-second timeout, reported as a wrong password (illustrative framing of the actual measured finding)

Before the fix, a real, measured login attempt against Centriu Vértice took 11.5 seconds before the authentication provider itself gave up and reported a timeout — and the person attempting to log in saw the exact same message a genuinely wrong password would have produced: "Email or password incorrect." Their password was correct. After the fix, the identical kind of failure — a provider-side timeout or service disruption — produces a distinct, honest message stating specifically that the password was not rejected and inviting a retry, while an actually-wrong password, or an unrecognized email address, both continue to produce the original, deliberately ambiguous message that gives an outside observer no way to tell the two apart.

What changes operationally

Centriu Vértice's login flow now classifies authentication failures into four honest, distinct outcomes instead of one fixed, credential-shaped message for every failure — explicitly telling someone affected by a genuine service failure or timeout that their password was not rejected — while deliberately preserving the pre-existing anti-enumeration protection that keeps a wrong password and a nonexistent account indistinguishable, and while excluding raw provider error text from internal logs.

When this is not the right fit

This automation governs how Centriu Vértice's own login flow classifies and communicates authentication failures — it does not change how credentials themselves are validated, does not weaken the anti-enumeration protection for the two cases (wrong password, unrecognized account) that must stay indistinguishable by design, and is specific to a product that authenticates through an external provider capable of failing independently of the credential submitted.

One fixed message for every failure vs. a classification that still protects the two cases that must stay identical

Mapping every authentication failure into one fixed message is the simplest possible design and, for exactly two specific cases (a wrong password and a nonexistent account), is also the CORRECT design — those two genuinely need to stay indistinguishable. The gap is in applying that same fixed mapping to every OTHER kind of failure too, where the identical message actively misleads whoever is trying to figure out what to do next. A classification that reads the most reliable signal first, and is deliberately, testably scoped to preserve the two cases that must remain identical while being honest everywhere else, keeps the real protection without paying for it with every other kind of failure.

Related systems

Main system: Centriu Vértice.

What it does NOT do

  • Does not weaken Centriu Vértice's anti-enumeration protection — a wrong password and a nonexistent account continue to produce the identical message, confirmed by a dedicated test that fails specifically if this invariant is ever broken by a future change.
  • Does not change how credentials are actually validated — the underlying authentication call and its pass/fail logic are unchanged; the fix is entirely in how a failure's CAUSE is classified and communicated afterward.
  • Does not log the raw, provider-supplied error message anywhere — structured logs carry a correlation id, latency, and classified failure type only, specifically to avoid recording text that could echo back a caller's own submitted input.
  • Does not retroactively identify which past login failures were misclassified before this fix shipped — a team with that concern would need its own historical log review, and the previous logs did not distinguish failure causes in the first place.
  • Does not overlap with the other two fixes shipped in the same commit (the write-surface reduction, and the AI-agent tool access surface) — both are covered on their own companion pages and are architecturally unrelated to authentication-failure messaging.

Security and governance

Centriu Vértice's login flow classifies authentication failures into four distinct, honest outcomes while deliberately preserving its anti-enumeration protection — a wrong password and a nonexistent account remain indistinguishable by design, confirmed by a dedicated test. Structured logs exclude raw provider error text. Any personal data referenced in login or account records 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 on a single plan. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

Was the 11.5-second timeout a one-off, or a measured, reproducible finding?

It was measured directly: a real login attempt took 11.5 seconds, and the authentication provider itself reported a timeout (`context deadline exceeded`, surfaced as an HTTP 504) — the fix's own account cites this exact measurement as the case that exposed the underlying defect.

Does the more detailed classification let an attacker learn which email addresses are registered?

No — the two cases that must remain indistinguishable for anti-enumeration (a nonexistent email address, and an existing one with a wrong password) still produce the exact identical message under the new classification, confirmed by a dedicated test that specifically checks this.

How does the classification decide which message to show, given failures can look similar?

It reads the most reliable signal first — an HTTP status code before a provider-specific error code, and a code before any free-form text — because a rate limit can arrive with no code at all, and a genuine service failure can arrive with wording that reads exactly like a rejected credential if trusted at face value.

Why exclude the raw provider error message from logs?

Because that raw text can echo back exactly what the caller originally submitted in the request — logging it would turn an operational diagnostic record into an unintended record of submitted, potentially sensitive input.

Is this the same fix as the write-surface reduction or the AI-agent tool access pages?

No — those cover a separate database-privilege reduction and a separate AI-agent read-only tool surface, both from the same commit but architecturally unrelated to how login failures are classified and messaged.

What does Centriu Vértice cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Vértice tells a real login problem from a wrong password

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Vértice — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Vértice — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review