WoopoWoopo
blogHow Plugin License Keys and Authentication Actually Work (And How to Build a Simple One)
Development

How Plugin License Keys and Authentication Actually Work (And How to Build a Simple One)

July 17, 2026 · Woopo · 9 min read
How Plugin License Keys and Authentication Actually Work (And How to Build a Simple One)

If you sell a paid audio plugin, at some point you have to answer one question: how do you stop everyone from sharing one copy? By the end of this post you'll understand the real plugin license key system options, how VST serial numbers work under the hood, and how to build a simple, safe licensing check that verifies a signed license with an embedded public key. You'll also know the one security mistake that quietly wrecks most homegrown systems.

Start with the honest framing, because it changes every decision that follows: any copy protection that runs on the user's machine can be cracked. Your goal is not an unbreakable wall. It's deterrence for casual sharing plus a great experience for the people who actually paid you.

The real licensing models, and what each one costs you

There are five approaches you'll actually see in the wild. Each trades convenience against effort against how much friction legit buyers feel.

1. Plain serial keys

The buyer gets a string like MORPH-7F3A-9C21-B8E4. They type it into the plugin, the plugin checks whether it "looks valid," and unlocks.

  • Upside: dead simple. No server, works offline, easy to email.
  • Downside: one working serial unlocks every install. As soon as one key leaks (and it will, on forums and key-gen sites), your protection is gone. If your validity check is a formula baked into the plugin, someone can reverse it and generate infinite keys.

This is how a lot of early VST serial numbers worked, and it's why key-gens exist. Fine as a speed bump, useless as real protection.

2. Serial plus online activation

Same serial, but the plugin phones home to your server to activate it. The server records that this key was used, ties it to a machine, and can refuse a key that's been activated too many times.

  • Upside: you can detect and stop mass sharing. You can deactivate refunded or chargeback keys.
  • Downside: you now run a server that must stay up basically forever. If it goes down, or you shut down the business, paying customers can get locked out. You also need a plan for offline users.

3. Offline signed license files

Instead of a typed serial, the buyer gets a small license file. The file contains their details (name, email, product, maybe an expiry) and a cryptographic signature. The plugin verifies the signature and unlocks. No network needed.

  • Upside: works fully offline, can't be forged without your private key, and each file is tied to a specific buyer, which discourages sharing (their email is in it).
  • Downside: a determined pirate can still share one valid file, or patch the check out of the binary. You need to do the crypto correctly (more on that below).

This is the sweet spot for most indie developers, and it's the approach I recommend building if you're rolling your own.

4. Account-based (store or launcher verifies ownership)

No serial at all. The buyer signs into an app or store that knows what they own, and that app installs and unlocks the plugin. Ownership lives in an account, not in a string of characters.

  • Upside: zero keys to type, lose, or leak. Transfers, refunds, and re-downloads are just account changes. This is what Steam does for games.
  • Downside: you need the account system, the store, and the installer. Building that from scratch is a real project.

5. Hardware dongles and iLok

Licenses live on a physical USB dongle or a cloud-backed hardware token. The plugin checks the dongle is present.

  • Upside: the strongest deterrent in common use. The license is tied to hardware you don't control, so casual copying is hard.
  • Downside: the most friction for honest users. People lose dongles, forget them, hate carrying them, and resent the extra cost. At indie prices this often annoys customers more than it stops pirates.

The one security rule that matters most

Here's the mistake that sinks most first attempts, so read this twice.

Verification must use public-key (asymmetric) signatures. Your plugin ships ONLY a public key.

The logic is simple once you see it. Anything you compile into your plugin binary can be extracted from it. A shipped plugin is just a file on a stranger's disk, and people will open it in a disassembler. So:

  • If you bake a secret into the plugin (a private signing key, or a symmetric password used to validate serials), someone will find it and use it to generate their own valid licenses. Game over.
  • If you bake only a public key, it doesn't matter that it's extractable. A public key can verify signatures but cannot create them. Your private key stays on your server, and only you can sign a valid license.

This is the whole trick. Signing happens server-side with a private key nobody else has. Verification happens client-side with a public key everyone can have. Never put the private key, or any symmetric secret that gates unlocking, in the binary.

Getting this backwards is the difference between "annoying to crack" and "cracked in an afternoon with a key-gen."

A simple system you can actually build

The offline signed license file is the best effort-to-protection ratio for a solo developer. Here's the shape of it.

Server side (runs when someone buys):

  1. You hold a private/public key pair. The private key never leaves your server.
  2. On purchase, you build a small license payload: product id, buyer email, purchase date, maybe a machine id and an expiry.
  3. You sign that payload with your private key.
  4. You send the buyer the payload plus the signature (together, that's the license file).

Client side (runs inside the plugin):

  1. The plugin has your public key compiled in.
  2. On load, it reads the license file, then checks the signature against the payload using the public key.
  3. If the signature is valid and the fields look right (correct product, not expired), it unlocks. Otherwise it stays in demo mode.

Conceptually, the verify step looks like this:

// --- SERVER (private key, secret, never shipped) ---
payload = {
  product: "morph",
  email:   "buyer@example.com",
  issued:  "2026-07-20",
  machine: "a1b2c3...",   // optional, for node-locking
  expires: null
}
signature = sign(private_key, canonical_bytes(payload))
license_file = { payload, signature }   // give this to the buyer

// --- CLIENT (inside the plugin, public key only) ---
PUBLIC_KEY = "<baked into the binary>"

function checkLicense(license_file):
    p = license_file.payload
    if not verify(PUBLIC_KEY, canonical_bytes(p), license_file.signature):
        return DEMO          // forged or tampered
    if p.product != THIS_PRODUCT:
        return DEMO
    if p.expires and today() > p.expires:
        return DEMO
    return FULL

A few practical notes:

  • Use a modern signature scheme. Ed25519 is a great default: small keys, fast, hard to misuse. RSA works too.
  • "Canonical bytes" matters: sign and verify the exact same byte representation of the payload, or valid licenses will randomly fail. Serialize the fields in a fixed order.
  • Don't invent your own crypto. Call a vetted library for sign and verify.

Node-locking, and the pitfall nobody warns you about

Node-locking means tying a license to one machine, usually by hashing some stable machine identifiers into a "machine id" and putting it in the payload. The plugin recomputes the machine id at load and refuses to run if it doesn't match.

This genuinely raises the bar: a shared license file won't work on a different computer. But here's the real-world trap that generates angry support emails.

People change machines all the time. They buy a new laptop, reinstall their OS, swap a drive, or run your plugin on both a studio desktop and a travel laptop. If your machine id is too strict (keyed to a single component that changes), legit buyers get locked out through no fault of their own.

So if you node-lock:

  • Allow a small number of activations per license (say 2 to 3), not just one.
  • Give users a self-service way to deactivate an old machine and move the license. Don't make them email you and wait.
  • Don't key the machine id to something fragile like a single MAC address that changes with every network adapter.

The honest customers are the only ones this friction reliably reaches, so make sure it doesn't punish them.

Deterrence, not a fortress

Repeat after me: client-side DRM is crackable. All of it. Someone can patch the checkLicense function to always return FULL, and no amount of cleverness in your binary stops a skilled cracker with enough motivation.

That sounds bleak, but it points at the right strategy. What actually reduces piracy at indie prices isn't heavier DRM, it's making the paid version obviously nicer to live with:

  • One-click install and updates. Cracked copies go stale. Yours quietly stays current.
  • A real account with re-downloads, license recovery, and easy machine transfers.
  • Cloud presets and new content that flow to paying users automatically.

Convenience competes with piracy better than fear does. Most people don't pirate because they're thieves. They pirate because it was easier than paying. Flip that, and you win the customers worth having. Heavy dongles and always-online checks often lose you sales while barely slowing the crackers.

What to build first

If you're shipping your first paid plugin, start with an offline signed license file: private key on your server, public key in the binary, a modern signature scheme, and a couple of activations with self-service transfer. That gets you real deterrence without running fragile infrastructure, and it's honest about what license key verification can and can't do.

If you'd rather not run a key server, sign licenses, or handle transfers yourself, account-based licensing removes the whole problem: the store and app confirm ownership at install time, so there's no serial to type and no key infrastructure to maintain. That's the model platforms like Woopo provide, and it's worth considering before you build a signing server from scratch.

Whichever route you pick, remember the two rules that matter: ship only a public key, and spend your energy making the legit experience great. The wall was never going to be unbreakable. A product people are happy to pay for is the real protection.

Sell your plugin on Woopo →

keep reading

more posts