maski
Security

Security overview.

Last updated: 2026-06-18.

This page is the technical companion to the Privacy policy. It describes the controls we have in place today, the controls we haven't built yet but are committed to, and how to report a problem.

We try to be specific. Vague claims about being "bank-grade" or "enterprise-secure" don't help anyone reason about a system. Where something isn't done yet, we say so and we say when.

What we encrypt at rest

The following fields are encrypted with AES-256-GCM before they hit the database, using a per-record cipher tag and a server-side key:

The cipher implementation is cloak_ecto, a well-reviewed Elixir library. Keys are versioned: every encrypted record carries a tag that names the key it was sealed under, so we can rotate keys without re-encrypting old data. New writes use the current key; old reads transparently fall through to the older one.

How we look up encrypted data

Encryption breaks lookup. To get it back without decrypting on every query, we store a blind index alongside each searchable encrypted field: an HMAC-SHA-256 fingerprint computed with a server-only key that's separate from the cipher key.

Lookups happen against the fingerprint. A database dump on its own doesn't reveal the underlying value — and because the HMAC key lives in application memory, never in the database, an attacker who steals a database backup cannot brute-force the fingerprints back to plaintext addresses without also stealing the running server.

The HMAC key is versioned independently of the cipher key. Both can be rotated without service interruption.

What we encrypt in transit

Disk encryption

The production database volume runs on LUKS full-disk encryption. A stolen disk does not yield a readable database without the LUKS passphrase, which lives in a separate operator-controlled secret store.

Authentication

Rate limiting and abuse controls

Every public endpoint is gated by a rate limiter. Specifics:

Operational discipline

Where the data lives

| Surface | Provider | Region | | --- | --- | --- | | Application + database | Amazon Web Services (EC2) | ap-south-1 (Mumbai) | | Outbound email delivery | Amazon SES | ap-south-1 (Mumbai) | | Backups + exports | Amazon S3 | ap-south-1 (Mumbai) | | Billing | Dodo Payments | Global |

Breach notification

If we confirm an incident that exposes your data — a database leak, unauthorized access, or a sub-processor breach with material impact on you — we will notify you within 72 hours of confirmation. The notification goes to your primary login email, your secondary (recovery) email if you have one set, and to an in-app banner on your next sign-in. The notification will describe what was exposed, when, the steps we have taken, and the steps we recommend you take.

What we have not done yet

We don't claim certifications we don't hold. Today:

Reporting a vulnerability

If you've found something, we want to hear about it. Email hey@maski.dev with:

Safe harbor. We will not pursue legal action or report you to law enforcement for security research conducted in good faith against Maski's production systems, provided you:

We respond to vulnerability reports within 5 business days with an acknowledgement and a triage owner.

Contact

For security disclosures or any other inquiries: hey@maski.dev.