Security

Draft. Written from the repository's documents and code; not yet reviewed by the owner.

What protects an account, and what you do to keep it safe: API keys, two-factor sign-in, the audit log and webhook signatures. Each section says how it works, in the terms of the repository's documents and code, and what is not covered.

This page makes no claim about audits, certifications, penetration tests or compliance. None is recorded in the repository, so none is described. It also says nothing about the infrastructure of a particular deployment: where it runs, how it is backed up and who can reach its servers are the deployment's own answers.

API keys

Two-factor sign-in

People who sign in to the console can turn on two-factor sign-in with an authenticator app (TOTP, RFC 6238: six digits, thirty-second steps) and get ten single-use recovery codes, shown once.

The audit log

Who did what and when, for the actions that change money or access: keys created, rotated and revoked; members invited, changed and removed; plan versions published; webhook endpoints created, changed and deleted and their secrets rotated; customers blocked and unblocked; credit notes and refunds; payment provider and e-invoice accounts connected, replaced and removed; the tenant's status and settings; two-factor changes.

Webhook signatures

Every delivery carries Payrudder-Signature: t=<unix time>,v1=<hex>, where the hex is HMAC-SHA256 of <t>.<raw body> under the endpoint's secret. Verify it on the raw bytes, compare in constant time and reject a time more than five minutes from your clock; the SDKs do all three (Webhooks).

Pages your customers open

An invoice link is addressed by an unguessable token (256 random bits; only a hash is kept), shown once when the link is made. The invoice page is not indexed or cached and loads nothing from another site. Payment links and the customer's own page (read-only, one customer's invoices and payments) also work by a token that is returned once. A link works until it expires (an ad hoc payment link lasts 30 days, an invoice link 90, at most 365) or is revoked.

What is left to you

Protect the people who can sign in (two-factor, and remove members who leave), keep keys and signing secrets out of code, verify every webhook, watch the audit log for keys and members you do not recognise, and use a sandbox key wherever a test needs one.