Re: Password identifiers, protocol aging and SCRAM protocol - Mailing list pgsql-hackers
From | Michael Paquier |
---|---|
Subject | Re: Password identifiers, protocol aging and SCRAM protocol |
Date | |
Msg-id | CAB7nPqT2UGWm0ukdomC+mG-co6nmKer62vuSGRxwtc+jS8uQPA@mail.gmail.com Whole thread Raw |
In response to | Re: Password identifiers, protocol aging and SCRAM protocol (Heikki Linnakangas <hlinnaka@iki.fi>) |
Responses |
Re: [HACKERS] Password identifiers, protocol aging and SCRAM protocol
|
List | pgsql-hackers |
On Thu, Dec 8, 2016 at 5:55 PM, Heikki Linnakangas <hlinnaka@iki.fi> wrote: > On 12/08/2016 10:18 AM, Michael Paquier wrote: >> Hmmm. How do we handle the case where the user name does not match >> then? The spec gives an error message e= specifically for this case. > > Hmm, interesting. I wonder how/when they imagine that error message to be > used. I suppose you could send a dummy server-first message, with a made-up > salt and iteration count, if the user is not found, so that you can report > that in the server-final message. But that seems unnecessarily complicated, > compared to just sending the error immediately. I could imagine using a > dummy server-first messaage to hide whether the user exists, but that > argument doesn't hold water if you're going to report an "unknown-user" > error, anyway. Using directly an error message would map with MD5 and plain, but that's definitely a new protocol piece so I'd rather think that using e= once the client has sent its first message in the exchange should be answered with an appropriate SASL error... > Actually, we don't give away that information currently. If you try to log > in with password or MD5 authentication, and the user doesn't exist, you get > the same error as with an incorrect password. So, I think we do need to give > the client a made-up salt and iteration count in that case, to hide the fact > that the user doesn't exist. Furthermore, you can't just generate random > salt and iteration count, because then you could simply try connecting > twice, and see if you get the same salt and iteration count. We need to > deterministically derive the salt from the username, so that you get the > same salt/iteration count every time you try connecting with that username. > But it needs indistinguishable from a random salt, to the client. Perhaps a > SHA hash of the username and some per-cluster secret value, created by > initdb. There must be research papers out there on how to do this.. A simple idea would be to use the system ID when generating this fake salt? That's generated by initdb, once per cluster. I am wondering if it would be risky to use it for the salt. For the number of iterations the default number could be used. > To be really pedantic about that, we should also ward off timing attacks, by > making sure that the dummy authentication is no faster/slower than a real > one.. There is one catalog lookup when extracting the verifier from pg_authid, I'd guess that if we generate a fake verifier things should get pretty close. >> If this is taken into account we need to perform sanity checks at >> initialization phase I am afraid as the number of iterations and the >> salt are part of the verifier. So you mean that just sending out a >> normal ERROR message is fine at an earlier step (with *logdetails >> filled for the backend)? I just want to be sure I understand what you >> mean here. > > That's right, we can send a normal ERROR message. (But not for the > "user-not-found" case, as discussed above.) I'd think that the cases where the password is empty and the password has passed valid duration should be returned with e=other-error. If the caller sends a SCRAM request that would be impolite (?) to just throw up an error once the exchange has begun. > Although, currently, the whole pg_hba.conf file in that example is a valid > file that someone might have on a real server. With the above addition, it > would not be. You would never have the two lines with the same > host/database/user combination in pg_hba.conf. Okay. -- Michael
pgsql-hackers by date: