Security model
Security products earn trust by being clear about their limits, not by making big claims. Here is exactly what PassNumber is designed to do, what it leaves to you, and what it does not pretend to do.
Threat model
An attacker who can observe a single login (over your shoulder, a camera, or a keylogger capturing one session) should not be able to reuse what they saw. That is the core design goal, and the reshuffle achieves it.
How the demo is built
Both login methods — Classic and Sequence — run on the same engine and the same storage rules.
Secrets are stored as PBKDF2-SHA256 (310,000 iterations) with a per-account random salt and an optional server-side pepper, compared in constant time. Hashes are versioned and upgrade automatically at login.
Every database query uses PDO prepared statements. No query is built by string concatenation, so injection is closed off.
Every form carries a CSRF token; session cookies are HttpOnly and SameSite, and become Secure automatically over HTTPS.
After repeated failed attempts an account locks for a cooldown window, throttling guessing at the account level.
The demo uses SQLite — a local file — so there is no database password to commit, leak, or rotate.
Every choice is encoded as a labelled token in a fixed order (no arithmetic, no overlapping values), so two different secrets can never produce the same stored hash.
By default the server builds exactly one candidate from your input and compares one hash. Any accepted variant — like the optional rotating start row — is an explicit opt-in, with its guessing-strength cost (~2 bits) stated at sign-up. No silent acceptance sets.