Sign in to a VPN client that asks for a password and then a six-digit code, and two prompts look like two independent barriers. Counted by factor type, they are: the password is something you know, the code is something you possess. Counted by what a single compromised laptop exposes, they can collapse into one boundary, because the thing you possess is a file on the machine you are typing into. The gap between those two counts is what this walkthrough is about.

Follow one login from the password field to the code box

Watch the sequence rather than the labels. The client sends the password, the server replies that a second proof is required, and the client opens a field for six or eight digits. Behind that field sits a generator application holding a shared secret and a clock. It computes a value from the secret and the current time step, and the server recomputes the same value from its copy of the secret.

Both sides hold the same key material. That symmetry is the part people miss when they describe the code as a secret: the provider can generate your codes too, which is why the seed is worth more than any single output. A code that leaks is a one-time value; the seed that produced it is a permanent credential that keeps producing valid values until it is replaced.

Activation is the other half of the flow. A generator that unlocks with a device passcode, a biometric prompt or an encrypted container presents a possession proof plus something else. One that runs unencrypted and unlocks with the operating system session presents only the file. The same application can offer both arrangements depending on how enrollment was done, so the deployment decision lives in that step, not in the app's marketing page.

Decide what the code actually proves

Standards language is unusually clear here, and worth reading directly. NIST's authenticator guidance lists software-based OTP generators as authenticators, distinguishes single-factor OTP from multi-factor OTP with an activation factor, and states that OTP authentication is not phishing-resistant. Each of those three clauses changes what you can claim about the prompt.

Not phishing-resistant is the sharpest edge. A code typed into a field can be typed into someone else's field, in real time, by a person who was persuaded to do it. The window is short, which reduces the number of useful attempts but does not close the technique. If your requirement includes resisting that, OTP is the wrong primitive no matter where the generator runs.

Single-factor versus multi-factor is the second distinction. A code that appears with no activation step proves possession of a file and nothing else, and the file is only as strong as the account that can read it. Add an activation factor and the claim improves, though it still describes the proof presented at login rather than the isolation of the machine producing it.

See what a compromised laptop can reach

An attacker with code execution on the workstation is not limited to reading the field you are typing in. The session established after a successful login is usually a token or cookie, and a token can be used from another machine without any code at all. If that is the capability you are defending against, adding a second prompt at login changes the number of steps in the attack, not the outcome.

ArrangementWhat it adds at loginWhat it leaves inside the laptop boundary
Password plus TOTP app on the same machineA possession proof the password alone does not supplyThe seed, the unlock step and the authenticated session
TOTP app on a separate phoneSeed storage outside the workstationSession cookies, the typed password and any prompt that can be proxied
Hardware key with a signed challengeA per-login signature bound to the originWhatever the browser and the workstation are already trusted to do

Read the third column as the honest one. Every arrangement above leaves something in the workstation's trust boundary, because the workstation is where the session is used. What changes is whether the long-lived secret travels with that boundary or stays outside it, and whether the proof is bound to a specific origin so a lookalike page cannot relay it.

Two smaller details belong in the same picture. A code remains valid for its acceptance window, often thirty seconds plus a tolerance for clock skew, so a captured value can be replayed inside that window unless the verifier refuses reuse. And installing a new generator does not terminate sessions that were already authenticated, so a stale session outlives the credential change that was supposed to contain the incident.

Move the generator only where separation helps

Putting the code generator on a phone is a real improvement for one specific failure: a stolen laptop no longer carries both proofs. It does nothing for a session hijack on the laptop, nothing for a user who types a code into a phishing page, and nothing for the recovery codes that were printed once and photographed into a notes app.

So write the requirement before choosing the tool. If the goal is an extra proof against a leaked password, say that plainly, and the same-device app already delivers it. If the goal is resilience to compromise of the VPN workstation, name that attacker capability and pick an arrangement assessed for it, with the phishing requirement stated separately rather than assumed.

Then handle the operational half, which decides whether any of it survives contact with an incident. Device loss needs a documented replacement path, credential rotation needs to revoke active sessions, and enrollment material needs the same protection as the seed, since an unprotected enrollment copy hands an attacker the same future codes by a shorter route. Enumerating those four items is more useful than arguing about whether same-device tokens are good or worthless.

Skyldar greinar