Trust & Compliance

Security at WipeCert

Our trust model, key management, data flows, and disclosure policy. The information here is what auditors and security review teams ask for — documented in plain language, sourced from production reality, no marketing fluff.

Public verificationEd25519 signaturesRFC 8785 canonical JSONNIST 800-88 aligned

Trust Model

Anyone can verify a certificate without trusting WipeCert.

Every wipe certificate is signed with Ed25519 (RFC 8032) over the certificate's canonical JSON form (RFC 8785, JCS). The public verification key is published as JWKS at /.well-known/jwks.json. Three implications:

  • No CA, no key escrow.Customers and auditors verify against our published JWKS directly. There is no third party we trust on our customers' behalf.
  • Tampering is detectable. Any change to the certificate body — one byte in a serial number, one digit in the hash — invalidates the signature.
  • Offline verification works. Auditors can re-verify a certificate years after the fact using only the PDF, the public key, and the documented algorithm. No WipeCert API call required.
Verification (Node)
const { createPublicKey, verify } = require("node:crypto");
const canonicalize = require("canonicalize");
const jwk = await fetch("https://wipecert.com/.well-known/jwks.json").then(r => r.json()).then(j => j.keys.find(k => k.kid === payload.kid));
const ok = verify(null, Buffer.from(canonicalize(payload), "utf8"), createPublicKey({ key: jwk, format: "jwk" }), Buffer.from(signature, "base64url"));

Key Management

Where the signing key lives.

AlgorithmEd25519 (Curve25519 EdDSA)
Key length256-bit private key, 256-bit public key
StorageEncrypted in our hosting platform's secret store. Decrypted only inside server runtime memory; never written to disk.
AccessNo human reads the key after generation. Authorized admins can rotate it; the key bytes are not available in any UI.
RotationActive key ID is stamped into every signature (kid field). Future rotations append a new key to the JWKS without invalidating older signatures — verifiers select by kid.
Compromise planRevoke key in our secret store, generate new keypair, publish new JWK alongside the old one (marked "use": "verification-only"), re-sign affected certificates, post incident notice on /status.

Data Flows

What we collect, where it lives.

WipeCert stores three kinds of customer data in a managed Postgres database (US-East AWS region), with row-level security gated by organization_id:

Account & profileName, work email, hashed password (bcrypt), organization membership, role.
Device recordsDevice name, manufacturer, model, asset serial, drive serial, drive type, capacity, firmware revision. Provided by the operator at registration.
Wipe recordsMethod, standard, hash before / after, Merkle roots over sampled chunks, agent version, operator ID, timestamps, signed canonical payload.
Encryption at restPostgres-level AES-256. Backups encrypted with same key derivation.
Encryption in transitTLS 1.3 between agent and API, between dashboard and API, and between API and Postgres.
Customer data we do not collectWipe operations send no file contents, file names, partition tables, or recovered data. The agent only reports drive identification metadata and cryptographic hashes.
Self-service data export (GDPR Art. 15 + Art. 20)Authenticated users can download every row we hold for their account at GET /api/account/export. Returns JSON in a documented format. To request deletion instead, email privacy@wipecert.com from the account's registered email — we respond within 30 days.

Standards

What we align with.

NIST SP 800-88 Rev. 1

Media sanitization (Clear, Purge, Destroy)

ISO/IEC 27040

Storage security and sanitization

DoD 5220.22-M

Multi-pass overwrite (legacy support)

RFC 8785 (JCS)

JSON canonicalization for signing

RFC 8032 (EdDSA)

Ed25519 detached signatures

GDPR Art. 17

Right to erasure (data subject requests)

HIPAA §164.310(d)(2)

Disposal of electronic PHI

WipeCert is not currently SOC 2 Type II audited. We will publish the attestation on this page once the audit completes.

Subprocessors

Vendors with access to customer data.

We maintain a current list of subprocessors with their purpose, region, and DPA links. Customers and auditors can request the full list at any time by emailing privacy@wipecert.com from a verified account email or under an executed mutual NDA.

Enterprise customers receive subprocessor change notifications with at least 30 days' notice as part of their data processing agreement.

Application Security

How the dashboard and API are hardened.

AuthenticationEmail/password (bcrypt) or Microsoft OAuth. Session JWTs are HTTP-only cookies, rotated server-side.
Multi-factor authTOTP enrollment available for every account at /auth/mfa/enroll.
API key authenticationx-api-key header on agent endpoints. Keys are stored as bcrypt hashes; the plaintext is shown exactly once at generation.
Rate limitingPostgres-backed sliding window enforced on agent endpoints (60-240 req/min by key), wipe creation (30/min/user), and public verification (30/min/IP).
Row-level securityAll customer-data tables carry RLS policies gated by organization_id. The service-role key is only used by trusted server-side handlers (webhooks, agent APIs).
CSRF / clickjackingServer actions only — no XHR-style endpoints accept third-party origins. Sensitive routes return X-Frame-Options: DENY at the platform edge.
Secret managementAll secrets live in encrypted environment variables and a managed secret store. No secret is committed to source control. Our config template only lists keys, never values.

Vulnerability Disclosure

If you find something, tell us.

We welcome reports from security researchers. Please email security@wipecert.com with:

  • A description of the issue and the affected endpoint or page
  • Steps to reproduce (curl or browser)
  • Impact assessment in your own words
  • Your contact information for follow-up

We acknowledge reports within 2 business days, triage within 5, and aim to patch critical issues within 14 days. We will not pursue legal action against researchers acting in good faith — please don't pivot beyond the proof of concept, don't exfiltrate other customers' data, and don't test against accounts you don't own.