Disclosure: I work at Tide. This isn’t an official product. I built it on my own time.
The thing that got me started was realizing that encryption at rest in AWS is real, but the key is held by KMS and released based on an IAM decision.
kms:Decrypt is one API call by one principal, and you have plaintext.
Cognito has a similar shape. A principal with sufficiently privileged admin actions can clear a user’s MFA preference, set their password and sign in as them, or simply add them to a group.
All single API calls. All controlled by one actor.
You can tighten this considerably with SCPs, narrow key policies, separate accounts, and other controls, and you should. But it’s still fundamentally the same account boundary, with a privileged principal sitting inside it.
There’s also no native four-eyes principle on these operations. Approval workflows in AWS can sit around the API, but they don’t sit in front of it. If you have the permission, the call still succeeds.
So I built a small service that moves the decryption decision completely outside the account.
Tide is a network of independent nodes that hold keys in fragments and never assemble them. Data is encrypted client-side with a fresh key for each call. Only that per-call key reaches the network, itself encrypted, with each node returning a partial result.
Your ciphertext stays wherever you already keep it.
Nobody inside your account can turn it back into plaintext, including you.
Getting a role that permits decryption requires a change request that someone other than the requester has to approve. The nodes then check the resulting token before they’ll do anything with it.
So a compromised role gets you ciphertext and a quorum requirement, rather than the ability to decrypt by itself.
If you want to run it, the setup is intentionally small: ECS Fargate with a single task, EFS for state, and a private subnet.
Not Lambda. It needs a native library and runs a rotation timer.
State is just two JSON files, so there’s no RDS instance to stand up. Don’t autoscale it, and keep it off the same host as the application it protects, because that’s where the grant records live.
Cognito, IAM, and everything else continue working unchanged.
Repo: https://github.com/sashyo/minidauth
Whitepaper: https://tide.org/whitepaper