Replacing SMS OTP in banking apps
Why one-time codes over SMS are failing, and how passkeys, push approval and voice biometrics compare as replacements.
SMS one-time codes became the default second factor in retail banking because they worked with the phone every customer already had, and needed nothing installed. That property — requiring nothing of the customer — is also why they are now the weakest widely deployed factor in the stack. The code travels over a channel the bank does not control, to an identity the bank does not own, and it is useful to anyone who can read it.
This guide sets out how SMS OTP actually fails, what supervisors across the Gulf and South Asia now expect instead, how the realistic alternatives compare, and what a migration looks like when you cannot switch every customer at once.
How SMS OTP fails
The failures are not exotic. They are routine, they are cheap to run at scale, and none of them require breaking any cryptography.
- SIM swap. An attacker persuades a mobile operator to move the customer’s number to a SIM they control. Every code then arrives on the attacker’s handset. The bank sees a correct code entered from a plausible device, because from its side nothing is wrong.
- Real-time phishing. A proxy site sits between the customer and the bank, relays the login, prompts for the code the bank just sent, and replays it within its validity window. The code is single-use and short-lived, and neither property helps: the attacker only needs it once, immediately.
- Interception in transit. SMS is delivered through interconnect networks with weak authentication between operators. Messages can be redirected or read without touching the customer’s device at all.
- Device malware. On a compromised handset, an application with SMS read permission forwards codes as they arrive.
The structural problem underneath all four is that an OTP is a shared secret in transit. It is generated somewhere, transmitted, and then typed by a human who has no way to tell whether the site asking for it is genuine. Every mitigation — shorter validity, rate limiting, device fingerprinting — narrows the window without changing that shape.
What regulators now expect
Supervisory language differs by market, but the direction is consistent. Authentication on a digital channel is expected to use more than one independent factor; the factors are expected to be genuinely independent, which is where a code delivered to the same handset that runs the banking app becomes difficult to defend; and for payment instructions, the authorisation is increasingly expected to be bound to the specific transaction rather than being a generic approval.
That last expectation — often described as dynamic linking — is the one SMS OTP handles worst. A six-digit code carries no information about what it is approving. If an attacker changes the beneficiary and the amount after the code is issued, the code is still valid, because it was never tied to either.
For the specific wording, thresholds and references in each market, see the regulator compliance mappings.
The alternatives compared
Four replacements are realistic for a retail bank today. They are not equivalent, and the differences matter more for some channels than others.
| Option | Phishing resistance | Customer experience | Cost model | Regulatory fit |
|---|---|---|---|---|
| FIDO2 passkeys | Strong — credentials are bound to the origin, so a proxy site cannot use them | Face or fingerprint; no code to read or type | No per-authentication cost after integration | Meets multi-factor expectations; supports transaction binding |
| Push approval in-app | Moderate — resists interception, but an approval prompt can still be socially engineered | One tap, but requires the app installed and online | Per-message infrastructure cost, lower than SMS | Widely accepted; depends on what the prompt displays |
| Voice biometrics | Moderate — a biometric is not phishable as a string, but replay and synthesis are the concern | Natural in a call or voice flow; poor as a primary app login | Per-verification processing cost | Usually an additional factor, rarely accepted alone |
| Hardware tokens | Strong — same origin binding as passkeys where FIDO2 based | Requires carrying and managing a device | High per-user hardware and replacement cost | Well understood; impractical at retail scale |
For a retail base measured in millions, hardware tokens fail on cost and logistics before any security discussion. Voice biometrics is a strong additional signal in a call centre or a voice-driven flow, but is not a general replacement for a login factor. The practical choice is between passkeys and push approval, and the deciding question is whether you need resistance to real-time phishing.
Push approval sends a prompt to a trusted app rather than a code over a network, which removes interception and SIM swap. It does not remove the human in the loop: a customer who has just been telephoned by someone claiming to be the fraud team will approve the prompt. Passkeys close that gap differently — not by asking the customer to judge, but by making the credential unusable anywhere except the origin it was created for.
Why passkeys change the shape of the problem
A passkey is a public-private key pair created on the customer’s device during enrolment. The private key stays in the device’s secure hardware and is never transmitted. The bank stores only the public key. At sign-in the bank sends a challenge; the device signs it, after the customer authorises with a face, fingerprint or device PIN; the bank verifies the signature against the public key it holds.
Three consequences follow, and they are the whole argument:
- Nothing to phish. There is no code and no password to disclose. The secret never leaves the secure element.
- Nothing to breach at scale. The server side holds public keys. A database disclosure yields no credential an attacker can use.
- Origin binding. The browser or operating system will only offer a credential to the origin it was registered against. A proxy site on a lookalike domain is not offered the credential at all, so the real-time phishing flow that defeats OTP has nothing to relay.
Transaction binding uses the same mechanism: the challenge includes the payment detail shown to the customer, so the signature attests to that specific instruction rather than to a generic session.
A migration path that does not require a flag day
No retail bank replaces its second factor across an entire base at once, and no regulator expects it to. The workable pattern runs passkeys alongside the existing OTP path and shifts traffic as enrolment grows.
- Enrol opportunistically. Offer passkey enrolment after a successful OTP authentication, when the customer is already verified and the friction is lowest. Do not put it behind a settings menu.
- Prefer, do not require. Once a customer has a passkey, make it the default path for that device, with OTP available as recovery.
- Instrument the fallback. Track how often enrolled customers still fall back to OTP and why. A persistently high rate usually points at a specific device or channel gap, not at customer reluctance.
- Close channels deliberately. Retire OTP per channel as coverage allows, rather than globally. Web and mobile app typically reach viable coverage well before ATM and card-not-present flows.
- Keep an account recovery story. The hardest problem is not enrolment; it is a customer who has lost every enrolled device. Decide that flow before launch, because it will otherwise be decided under pressure at the call centre.
Rollout checklist
- Inventory every channel that currently issues an OTP, including ATM and 3-D Secure.
- Decide the recovery flow, and who is authorised to run it, before enrolment opens.
- Define the step-up policy: which actions require a fresh authentication, and which require transaction binding.
- Agree what is logged for each authentication, and how long it is retained.
- Confirm where credential metadata is stored, against your market’s residency requirement.
- Instrument enrolment rate, fallback rate and authentication failure rate per channel from day one.
- Brief the contact centre before launch — most early friction surfaces there first.
How Fortanixor helps
FortAuth implements the passkey path described above across mobile app, web, ATM and 3-D Secure from a single credential, with the enrolment, recovery and step-up flows already built. It runs alongside an existing OTP path during migration rather than replacing it on a single date, and every authentication is written to an exportable audit trail. Control mappings for each market are on the compliance pages.
Questions, answered.
Yes, and during migration you generally must. The security benefit of passkeys is realised per authentication, so every sign-in that uses a passkey is protected even while the OTP path still exists for customers who have not enrolled. The goal is to retire OTP channel by channel as coverage allows, not to switch it off on a date.
They authenticate through your account recovery flow and enrol a passkey on the new device. Passkeys from the major platform providers also sync through the customer's platform account, so a replacement device of the same platform often restores the credential without any recovery step. Decide and test this flow before enrolment opens.
Support depends on the device's operating system version rather than on the banking app. Older handsets that cannot support platform authenticators continue on the existing path, which is one of the reasons the migration runs both factors in parallel rather than switching over.
A passkey authentication combines possession of the enrolled device with the biometric or PIN that unlocks the private key on it, so it satisfies multi-factor expectations in a single step. How a given supervisor characterises that is market-specific; the per-regulator mappings address it directly.
It removes the per-message cost of sending codes, which for a large retail base is significant. Whether that offsets the integration and enrolment effort depends on your current message volume and pricing, so it is worth modelling against your actual traffic rather than assuming.