In an API I have there’s a requirement to use an authentication method other than OAuth2 or any kind of token generation which requires making an extra HTTP call.
With this in mind there’s this https://www.xml.com/pub/a/2003/12/17/dive.html
I’ve only stored passwords as hashes and used functions like password_verify
to know the user sent the proper credentials without actually knowing the password stored in DB.
WSSE requires to encrypt with SHA1 the credentials being sent, which means the API needs to retrieve the password in plain text to recreate the digest and compare it to the one sent by the user.
So, how should I be storing this password if the code needs it to recreate the hash?
Should I have something like a master password and store them encrypted instead of hashed?
Most of the information I’ve found about WSSE is very very old, and some implementations have it marked as deprecated, do you know any other type of standard authentication where the user can generate the token instead of having to make an extra HTTP call?
This seems like a XY problem. You are asking how to do X, when actually you need to be doing Y.
Your description is either too vague, or something I have never encountered.
It seems like what you have is Service A, Service B, and a client.
Service B doesn’t have access to user credentials stored in Service A, but Service B has to know that the client has provided valid credentials for Service A.
At no point can the client make a request to Service A.
The client only makes requests to Service B.
And this has to be a username/password combination.
Is that right?
Implementing security tech from 2003 that is deprecated, especially considering it’s SHA1 (which was deprecated 10 years ago) is not a good idea. Like, just store the password plaintext level of bad idea.
You either have to reasses what you actually want to do to ensure it is actually secure, or you are not describing your goal well (XY problem : “how do I implement WSSE on SOAP” instead of “I’m trying to do Y”)
Seconded. In particular:
Why? What qualifies as an “extra” HTTP call, and why does it matter?
Well, an “extra HTTP call” is any call besides the one required for the client to access my API, in this case is an extra call to generate an access token.
Why does it matter? In words of the client: “making a call to generate a token is slow”
The client is not always right. Make them define “slow” in concrete comparison to the rest of the things that happen in their product and once you have a reasonable number, I think it’s likely you can beat it.
If it was happening every page load or every API call, you might have a weak argument.
Regardless, what’s the general architecture of this app? You’ve got an HTTP API, what else? How much is under your control, versus third parties?
I agree, the token has a lifespan of some hours so it could be generated after that amount of time, which for a ~400ms call is not that much, but I was overruled .-.
The only thing I control is the API, the client’s implementation is outside of my control (although I know is a backend service).
Okay, so you’re building an API that another server needs to auth with? If the opposing side is a server, a pre-shared PKI cert ought to work. If the opposing side is a potentially-untrustworth client application, the truth is there’s nothing that’s going to fit such a simple definition of “extra”. The back and forth it takes to establish token exchange is not “extra” is the cost you have to pay to get security.