32
How to store user's access tokens/API keys without hashing them?
(lemmy.pe1uca.dev)
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.
Hope you enjoy the instance!
Rules
Follow the wormhole through a path of communities !webdev@programming.dev
Someone wants you to use this WSSE? I would brush up your resume and start interviewing - it sounds like that place is on track for a "we liquidated our internal IT and now pay a consulting firm" level of security event.
In the meantime, If you have to store a non-rolling API secret for your app to use, and it's going to live a long time (not regenerated), then you need to secure the entire environment that has access to that secret. Any additional local reversible encryption is just security theater.
In this scenario, you need a popular modern well supported password vault soltion. Do not attempt to roll your own. The purpose of this vault is not to protect the secret, it is to quickly reset the secret* when it inevitably eventually gets compromised.
You must do frequent tests of replacing this secret, in production, with a new one. This is not theoretical. You will eventually either test it on your own terms, or on the badguys' terms.
Good luck, you're going to need it.
Someone want's me to implement a way to access a resource without having to make the extra HTTP calls required by OAuth, WSSE is a possibility since I saw it had some standards to send the credentials in a secure way.
I have been reading about WSSE for less than a week '^-^
Yeah, the idea would be the tokens used to generate the digest WSSE requires will live in our secure environment, and that's the question: how is a secure environment created to store tokens/API keys of users which will be used to authenticate them into my API?
I haven't implemented this kind of stuff so I don't know what are the best practices to store this kind of sensitive data.
So, I'd need to research password vaults to store my user's secrets so I can use them to authenticate them?
I went into WSSE since sending a client id + secret seems just rewording of basic authentication and well, sending the credentials in plain text seems more insecure than sending a hash.
Neat. I can help with some of these concepts:
You can protect your Basic Auth password simply by storing it in cleartext where it is needed with reasonable protections
(This is again assuming your use case is actually okay for not having OAuth. If it's health data, suck it up and do real OAuth, obviously.)
Reasonable protections for your Basic Auth passwords:
In summary:
Happy sailing!
Edit: Also, practice replacing the secret, ideally with automation - and preferrably do so every 90 days.
Edit 2: Make that password as long as heck and meaningless. No one needs to memorize this thing. Generate it random, long and meaningless, paste it in two places, and forget about it for 90 days.
Edit 3: Deliver this secret to your end user over the phone (spoken to a human, not a text message). Do so every 90 days. When they complain, ask them if they're interested in OAuth now.
Thanks for all the information and advises!
So in theory basic auth is enough when sent through HTTPS, right?
If this is the case then the user would need to handle their password and my API can keep storing just the hash.
In another comment JWT was suggested, maybe this could also be a solution?
I'm thinking the user can worry about generating and signing the token and we could only be storing the public key , which requires less strictness when handling it, this way we can validate the token has been signed by who we expect and the user will worry about the private key.
Yes. Don't put nuclear weapons, health data or huge sums of money behind it, but basic Auth has been doing a fine job for a lot of things for a long time, and HTTPS is a complete solution (until the next time it gets owned).
Yep. The hard part is securely delivering the generated secret to them. And making sure that, the shorter and less random that secret is, the more often it gets replaced. For a lot of not-too-sensitive use cases, a phone call and a long random secret will do the job.
JWT is a fantastic solution, and probably the first thing you want to upgrade to if your use case needs more than Basic Auth.
That makes sense. Note that many popular JWT libraries will do a lot of that for you.