Also there are ways to implement this without keeping the whole password in plaintext/reversibly encrypted. One example I just thought of:
Ask for 75% of the password each time, remember random 1/3rd of that (25% of full password) till the next login together with the hash, and on the next login ask for all the letters you haven't remembered (and fill the ones you remembered, then hash everything and compare).
You can adjust the percentages as needed if having 25% of the password in clear text is too insecure.
Given the (apparent) lack of security for the bank, I'd say the former. IF the bank was actually secure, then sure it'd be more likely for me to have a keylogger.
> Also there are ways to implement this without keeping the whole password in plaintext/reversibly encrypted
Maybe.
> One example I just thought of: Ask for 75% of the password each time, remember random 1/3rd of that (25% of full password) till the next login together with the hash, and on the next login ask for all the letters you haven't remembered (and fill the ones you remembered, then hash everything and compare).
I challenge you to really think about what you're proposing to do. I think it's far more convoluted: it does not solve the keylogger problem and adds complexity to both the client and the server. If you think I'm wrong, then write it up in a spec and show us.
Sure. It's fun.
On password creation:
0.0. demand 25% longer passwords from users than considered safe
0.1. along with the hash of the whole password remember a randomly choosen 25% of the characters of the password and their positions (in clear text or reversibly encrypted)
On each login:
1.0. ask only for the characters in positions you haven't remembered
1.1. server-side fill the positions you remembered
1.2. hash the result and see if it matches
If hash matches:
2.0. randomly choose 1/3rd of the freshly provided positions and remember them in clear text on server replacing the previous ones
2.1. give access
If hash doesn't match:
3.0. deny access, don't change anything on server
If I understand correctly - to get the whole password keylogger must be specific to this bank site (to understand which characters are provided), and must be active on at least 4 logins. In my book that's a big improvement.
And I can imagine writing the login page in a way that makes parsing it in keylogger to understand which characters are masked.
The difference in difficulty of keylogging 4 logins, and 1 login is, in practice, small. Once your computer is pwned, all bets are off.
To gather enough contextual information to defeat all this reliably, the keylogger would also need to be a screen scraper, internet monitor, etc. Straight away, this defeats the not-uncommon case of the inline USB keylogger.
If there's a keylogger on the system then it'd be trivial to log out the user a few times (and combine with manipulating what the user even sees such as which locations of the password to enter), or just simply be more patient.
Also, what about database backups? Given enough of them and the ever-increasing frequency they occur and time that backups live, you could recreate more of the user's password than intended.
Besides which, the partial login isn't random either. It's always sequential. You'll never be asked to enter character 3, then 1, then 8. It will always be asked in the same order as the password string itself.
It's monotonic, but not sequential. On one login you will be asked for positions 1,3,4,7,9, 10, on another you will be asked for letters 1,2,5,6,7,8. Merging such partial information isn't trivial if you don't know which positions you got.
Let's say you have 16-letter password. That's 4 missing letters during each login.
There's (16 over 4) = 1820 possible ways that the characters the keylogger see can be positioned in the real password.
Given that most people do not use random passwords (and are even less likely to in with a scheme like this), guessing the missing characters is likely trivial for most passwords.
Also the scheme you're describing is very clearly not the one in use here given that they asked for only 4 characters.
The bank gets hacked. I say this with the utmost certainty because while I haven't been hacked since I started behaving securely at 15 years old, my bank that uses partial passwords was recently hacked. I live in Pakistan, a lot of banks were hacked 2018-2019.
I also complained to them about saving passwords in plaintext. They never replied. Every bank in my country is terrible.
Plus, the keylogger could just collect a few logins and it completely defeats the whole thing, so it doesn't help anyway. It's just terrible, it makes everything worse
Hm, actually instead of masking the password to defeat keyloggers they could also just permutate the characters. So that you have to enter password in different order each time. But usability would suck so much :) I prefer the masking.
Also - universal keylogger wouldn't know which characters of the passwords you were asked for. They would need to make a keylogger designed for this bank website so it can understand which characters you provide. And they would need to update the keylogger with updates on the login website (which preasumably would be written in a way that makes it hard to know which characters these are - for example with randomly generated ids of the input fields and provided in random order then positioned with javascript).
I know - security by obscurity. But it does help.
Remembering a specific character of a password is not easy to do, so people will probably type it into notepad and then count to get the right one anyways.
TOTP is much more usable, and probably more secure than inventing your own ridiculous partial password scheme.
[x] [ ] [x] [ ] [ ] [ ] [ ] [x] [ ] [ ] [ ] [x] [ ]
And when you press a key it jumps to the next empty field.This partial password stuff is just utter garbage. It's lower security than a typical password, way lower security than multi-factor auth, blocks use of password managers, and is generally inconvenient for no good reason.
Makes it easy to remember the password without muscle memory.
But yes, all of the points raised in the answers [1] are totally valid. The extra security benefit is so small that really not worth the negative impact on usability. System designers should rather focus more on implementing 2FA.
Honestly, even if the salting was done independently per chunk, the fact that you know each chunk is under 5 characters long massively reduces the time to generate a rainbow table to verify the password, even more so if the entry field only allows 36 character entry.
That sounds obnoxiously insecure on the back-end. Notoriously, the most broken authentication mechanisms used plaintext (or reversibly encrypted) storage. The answers to the three security questions that the article links to also point this out.
Sounds like ING Poland needs to be called out by some security researchers.
[0] https://security.stackexchange.com/a/194818/47800
[1] https://security.stackexchange.com/a/7479/47800
[2] https://security.stackexchange.com/a/196430/47800