Each item below is implemented and tested in production today. The backend test suite covers KMS round-trip, cross-context rejection, magic-link single-use, rate limiting, provider error sanitization, and the aggregator's idempotency.
Read-only by default
Every supported integration uses read-only scopes: an AWS IAM role with an external ID, a GCP service account with billing/BigQuery read, and a DigitalOcean personal token with read-only permissions. Tovin.io can never mutate your cloud.
Tenant-bound KMS encryption
Credential blobs are encrypted with per-blob AES-256-GCM keys generated by KMS. The encryption context (org_id, kind) is bound to both the data-key generation and the AES-GCM AAD — a leaked envelope cannot decrypt into another organization.
Provider detail preserved
Normalized project totals keep enough source fields to trace back to provider billing data. Every dollar on the ledger has a verifiable provider row underneath.
Validation on connect
Each integration is verified with a no-op call (STS GetCallerIdentity, GCP billingAccounts.list, DO /v2/account) before any cost data is fetched. Provider errors are sanitized before reaching the UI.
Rate-limited magic links
Sign-in links are 32-byte URL-safe tokens, HMAC-SHA256 at rest, 15-minute TTL, single-use, and capped at 3 requests per email per 15 minutes. We do not leak which addresses exist.
Defense in depth at the edge
Body-size limit (5 MiB), per-org rule and sync cooldowns, ReDoS-guarded user regex (100ms canary thread), HttpOnly refresh cookies scoped to /auth, and HS256 JWTs with short access + long refresh windows.