Security

Security controls in Hireship are intentional and auditable. This page summarises what we encrypt, who can access what, and how we handle your resume.

Passwords

Passwords are hashed with Argon2id. Plain-text passwords are never stored, logged, or transmitted after hashing. HIBP k-anonymity check is performed at signup to reject breached passwords.

Sessions

Sessions are backed by Postgres. Cookies are HttpOnly, SameSite=Lax, and Secure in production. Session IDs are never logged.

Resume data

Resume files and parsed text are encrypted at rest using AES-256-GCM with a unique nonce per file. The encryption key is held in a server environment variable; raw file bytes are never written to the database. Downloads require an authenticated session — no signed URL scheme exposes your resume without auth.

Notification webhooks

Discord and Slack webhook URLs are encrypted with AES-256-GCM before storage. The plaintext URL is decrypted only at delivery time and is never logged.

Multi-tenancy

Every user-scoped query carries a user_id parameter enforced at the data-access layer. A CI check fails the build if any user-scoped query function lacks this parameter. One user cannot read another user's scores, resumes, channels, or applications.

Stripe webhooks

Stripe webhook deliveries are verified with HMAC-SHA256 before any payload is parsed. Replayed events are idempotent — no double-charges result from retries.

Reporting a vulnerability

See /.well-known/security.txt for our disclosure policy and contact information.