I've also found that for email fields you need to be careful to normalize the input (trim, casing) as safari had a habit of autocorrecting the first character to be a capital
I find apps that don’t trim the whitespace for the email field so annoying in terms of UX. I usually use a Text Replacement shortcut to fill in my emails (e.g. “gml” fills in my GMail address, “cld” my iCloud address etc.) and that always inserts a space after the email and I have to manually fiddle with the cursor to delete it.
Why is that relevant? The standard technically allows for case sensitivity but nobody does it
It's technically true that the part before the domain can be case sensitive, but as nobody does this the gain in UX from people not having to know the exact casing used during sign-up is worth it to me.
Actually I realise GP is equally ambiguous. But I read that as (and my own assumption would be) frontend retries with the variation, backend verifies against the same only one stored.
So now you have to create 2 flows, those before the new policy and those that were set after the normalization.
If you're actually using a 'strong enough' hash to prevent easy cracking if your hashed password database is leaked then you're doubling the server load which can be quite substantial in some cases.
And obviously this is server side
https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpubli...
In that case this solution would have the disadvantage that it wouldn’t be platform specific.
> Looks like the app is clever enough to try changing the case of the first letter if the first attempt fails.
Still, looks like a compromise between usability and security/reduced password entropy.
You may try 2 versions of first letter, but do they go as far as bruteforce removing all the % character combinations from the password, unless they did remove them all?
Normal password code would be
if (doHash(password+salt) == storedHash) {
failedLogins = 0;
return 1;
}
failedLogins++;
return 0;
This would presumably be if (doHash(password+salt) == storedHash) {
failedLogins = 0;
return 1;
}
if (doHash(swapFirstLetterIfClientIsMobile(password)+salt) == storedHash) {
failedLogins = 0;
return 1;
}
failedLogins++;
return 0;
So while the password is 'stored' in the server side heap, it's no different to normal password 'storage'If the hash is done in the client it's the same, just the client sends two attempts rather than one.
Edit: not a good idea.