13 comments

  • Retr0id3 hours ago
    Mmmm vibecrypto, my favourite. I don&#x27;t see anything <i>obviously</i> broken (at a glance) but as a perf improvement, there&#x27;s little reason to use Argon2id for the &quot;verification hash&quot; step, might as well use sha256 there. There is also no need to use ConstantTimeCompare because the value being compared against is not secret, although it doesn&#x27;t hurt.<p>The &quot;Crash-safe rotation WAL&quot; feature sounds sketchy and it&#x27;s what I&#x27;d audit closely, if I was auditing closely.
    • babawere3 hours ago
      Thanks for the look. On the verification hash, you&#x27;re right, SHA256 would work there. Argon2id was overkill, I agree 100%.<p>The crash-safe WAL is the part I&#x27;m most nervous about too. That&#x27;s exactly why I posted this. I want eyes on the rotation logic specifically.<p>And yeah, single bbolt db is a limitation. I could have used pebble or any other, but trade-off for simplicity (a single *.db). A true WAL will need external file. The storage is pluggable though also open to improvement.<p>Still very young.
  • ComputerGuru42 minutes ago
    We actually just ported SecureStore to go, it’s sort of like this but with cross platform clis and intended to also allow sharing secrets across services and languages, in a secure and embedded fashion! It’s available in rust, php, .net, JS&#x2F;TS, Python, and golang and easy to port to others.<p>I didn’t get a chance to do a write up but the golang port is here: <a href="https:&#x2F;&#x2F;github.com&#x2F;neosmart&#x2F;securestore-go" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;neosmart&#x2F;securestore-go</a><p>The approach to crypto is very different, we went with what’s very well understood and very well supported on all platforms with little or no dependencies (eg we can use web crypto in JS frontend or backend with no external libs or crypto JS library nonsense).<p>The original .NET and Rust code is from over a decade ago and carefully architected (well before vibecoding was a thing), the secrets are stored in a human readable (json) vault that can be embedded in your binaries or distributed alongside them and be decrypted with either password-based or key-based decryption (or both).<p>The rust repo has the most info: <a href="https:&#x2F;&#x2F;github.com&#x2F;neosmart&#x2F;securestore-rs" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;neosmart&#x2F;securestore-rs</a>
  • CharlesW1 hour ago
    From a project perspective, is this for fun or is it meant to be a production solution? If the latter, what problem(s) are you trying to solve that established solutions like fnox don&#x27;t? <a href="https:&#x2F;&#x2F;github.com&#x2F;jdx&#x2F;fnox" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;jdx&#x2F;fnox</a> (I&#x27;m an fnox user who&#x27;s unfamiliar with this space, and am curious what your critiques would be.)
    • babawere1 hour ago
      Both, honestly. Fun and production intent. But `production` here is very specific, embedded in a single Go binary, a single *.db not a CLI tool (the cli you see there is just for inspection) for developer or CI.<p>The problem fnox solves is great, unified access to secrets across dev, CI, prod with cloud backends. That&#x27;s a different layer of the stack.<p>Keeper solves a lower-level problem: you have a Go process (a load balancer, a control plane, a daemon) that needs to store secrets inside its own database not in a separate file, not in a cloud vault, not in env vars. Secrets that need per bucket isolation, audit trails, and crash-safe rotation.<p>Here is my thinking :<p>- fnox = how your CLI and deploy scripts get secrets<p>- Keeper = how your running binary stores secrets at rest<p>Different problems, Could I build Keeper on top of fnox? Probably. But then I&#x27;d have a file on disk with secrets that fnox manages which is exactly the problem I wanted to eliminate.
  • modelorona4 hours ago
    Name could conflict with Keeper Security
    • babawere3 hours ago
      So have been told. Will definitely look for a better name
  • emanuele-em3 hours ago
    Per-bucket DEKs with HKDF, hashed policy keys to kill enumeration, HMAC audit chain. This is the kind of boring-correct crypto design I rarely see in Go libraries. memguard for the master key is a nice touch too.
    • babawere3 hours ago
      I was thinking its better to be boring-correct :)
  • elthor894 hours ago
    I have been looking for something like this. I know openbao, hashicorp vault.<p>But they require to be placed on a separate server, and come with their own infra management.<p>Is the idea of this project to embed this into you app, instead of relying on .env or an external vault?
    • babawere3 hours ago
      Honestly… the initial use case is to hide certs from the file system and secrets from the environment. However, this can be extended.<p>The primary issue has been not being able to manage an encrypted storage system… the main goal is to have something that can be audited, not just secured.<p>yes 100% ... embeded
  • tietjens3 hours ago
    Could I use this to store secrets to hide env vars from agents?
    • babawere3 hours ago
      Definitely … agents cannot access your password unless you save it to the environment too. However it&#x27;s better to use resolvers ... depending on your use case
  • n0n4 hours ago
    Genuine question: what&#x27;s your thread model?<p>Vault gives time limited Tokens with Network Boundary. Instead of Keeper, i would just use age:<p># write<p>echo &quot;my secret&quot; | age -r &lt;recipient-pubkey&gt; &gt; secret.age<p># read<p>age -d -i key.txt secret.age
    • sneak2 hours ago
      <a href="https:&#x2F;&#x2F;git.eeqj.de&#x2F;sneak&#x2F;secret" rel="nofollow">https:&#x2F;&#x2F;git.eeqj.de&#x2F;sneak&#x2F;secret</a><p>This is an age+filesystem secrets manager that I made that is basically what you wrote, but with more organization.
    • babawere3 hours ago
      not when you need an audit system
      • n0n1 hour ago
        True, but AFAIK an audit system is worthless if it resides on the same potentially compromised machine, no?
  • RALaBarge3 hours ago
    Hey I ran this request through my AI harness (beigeboxoss.com), first with a smaller local model and then validated with Trinity Large via OR. <a href="https:&#x2F;&#x2F;github.com&#x2F;agberohq&#x2F;keeper&#x2F;issues&#x2F;2" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;agberohq&#x2F;keeper&#x2F;issues&#x2F;2</a> -- YMMV but wanted something to do with my coffee, thanks!
    • babawere2 hours ago
      The first bug has been confirmed however The second `vulnerability` would only be exploitable if an attacker could also break SHA-256 preimage resistance to forge valid checksums ??? correct me if am wrong
    • Retr0id3 hours ago
      &gt; The VerifyHMAC() function unconditionally returns true when the HMAC field is empty<p>This kind of thing is <i>super</i> common in vibecoded crypto, I wonder why it keeps happening.
      • RALaBarge3 hours ago
        Not sure, I&#x27;ve seen common things like this pop up a lot too, the same errors being tripped over. I&#x27;m not sure if it is a context thing or just a limitation of how the models work presently? For stuff that I&#x27;m using myself, I will run these through like the top 10 reasoning models on OR and just see where everything pans out.<p>Edit: here is an example of the process and output with something I put together the other day: <a href="https:&#x2F;&#x2F;github.com&#x2F;RALaBarge&#x2F;garlicpress&#x2F;blob&#x2F;master&#x2F;portfolio&#x2F;COMPLETE_RESULTS.md" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;RALaBarge&#x2F;garlicpress&#x2F;blob&#x2F;master&#x2F;portfol...</a>
      • babawere3 hours ago
        Even when you have a proper function and use AI for auto documentation, it silently changes it (insane) … I will defiantly fix this.
  • nonameiguess4 hours ago
    Keeper is already the name of a popular enterprise secrets store: <a href="https:&#x2F;&#x2F;docs.keeper.io&#x2F;en&#x2F;user-guides&#x2F;web-vault" rel="nofollow">https:&#x2F;&#x2F;docs.keeper.io&#x2F;en&#x2F;user-guides&#x2F;web-vault</a><p>I haven&#x27;t used it, don&#x27;t advocate for it, and have no opinion on either its viability or your product&#x27;s viability for any specific use case. Mostly I just think it&#x27;s a bit confusing to have two separate products in a very similar space with the same name.
    • babawere3 hours ago
      thanks for the update ... will definitely look for a better name
  • sneak2 hours ago
    I have a similar one called “secret”, also in Go, that is more CLI-focused and uses the filesystem as database.<p><a href="https:&#x2F;&#x2F;git.eeqj.de&#x2F;sneak&#x2F;secret" rel="nofollow">https:&#x2F;&#x2F;git.eeqj.de&#x2F;sneak&#x2F;secret</a>
    • babawere2 hours ago
      Thanks for sharing this. secret looks really well thought out, the three-layer key hierarchy is impressive. And using `age` is a solid choice. once considered it.<p>Different trade-offs though, Keeper is library first embedded. secret does per version keys with symlink switching - nice, Keeper does per-bucket DEK isolation + audit chains. Both solve &quot;encrypted local storage&quot; but for different workflows.<p>I&#x27;ll definitely be looking through your code for ideas
  • takahitoyoneda34 minutes ago
    [dead]
  • fedorsapronov23 minutes ago
    [dead]