4 ms·
With server salt version from P -> C -> S a compromised server could just steal C and still salt into S for password verification. Also it's safe on the wire or
by pests 6y ago
With server salt version from P -> C -> S a compromised server could just steal C and still salt into S for password verification. Also it's safe on the wire or in any logs, etc.
For the multiple machines comment, that is not true. The server can generate a salt/key (or whatever it should be named in this version) and communicate it over the initial request with the login page which is then sent back along with the altered client password, de-salted/unencrypted/turned into something can be compared to the users password. Basically CSRF. You wouldn't need to store these temp salts either if you embedded a timestamp and sign it.
- thaumasiotes 6y ago> For the multiple machines comment, that is not true. The server can generate a salt/key (or whatever it should be named in this version) and communicate it over the initial request with the login page which is then sent back along with the altered client password, de-salted/unencrypted/turned into something can be compared to the users password. Basically CSRF. I'm not following you. The system described was: 1. The user comes up with P. 2. The website salts and hashes it, creating C = hash(P,salt_c). 3. C is communicated to the server. 4. The server salts and hashes C, creating S = hash(C,salt_s). Now, in order to log in, the user must send C, not P, to the server. The goal of this design is that the user does not know C. They do know P. So in order to send C, either the user must remember the original value salt_c, or it must be communicated to them so that they can produce C from P. We are not contemplating the user personally remembering the value of salt_c, but it would be possible to store it in e.g. javascript local storage. But that would prevent the user from logging in from any device that didn't already have the salt stored. If they cleared their browser history and data, it would prevent them from ever logging in again. So the server must store salt_c. (As noted above, this means it's now perfectly possible for the server to directly verify that P is the user's "password", the value that hashes to C. But the scheme still allows us to avoid sending P over the wire.) Storing salt_c on the server is the only way to allow the user to log in from more than one browser session.