Skip to content
CredenShare
Security

Encryption

How CredenShare encrypts and protects your shared credentials.

CredenShare uses industry-standard encryption to protect every credential you share. This page details the encryption mechanisms and security architecture.

Where encryption happens

This depends on where the share is created, and the difference matters: on one path we hold a key that could decrypt your content, and on the other we hold none we can use.

Created viaEncrypted whereCan CredenShare decrypt it?
Web appIn your browserNo — the key never reaches us in the clear
REST APIIn your clientNo — the API refuses plaintext
Official SDKsIn your processNo — the client encrypts before the request
Slack appOn our serversYes — the credential passes through Slack first

Web and API shares

A content key is generated in the client and used to encrypt your fields with AES-256-GCM before anything is sent. That key travels in the share link's URL fragment, which browsers never transmit to a server. What we store is ciphertext plus a hash of an access token (and, with custody, sealed copies of the key), so we can serve the share to whoever holds the link without being able to read it.

The API enforces this rather than merely encouraging it: a create must declare e2ee-aes256-gcm and supply ciphertext, and a plaintext value is rejected. See client-side encryption for the exact wire format.

Every share gets its own content key, so exposing one link cannot decrypt any other share. We cannot recover a lost link. Unless the browser that created the share still holds its key, or zero-knowledge custody has kept a copy sealed to your account key, losing the link loses the content. An item_key_wrap, which the Node, Python and Go SDKs send when you set their custody option, is not such a copy: nothing in the product reads it back, so it cannot rebuild the link.

Slack shares

A credential sent through the Slack app has already passed through Slack before it reaches us, so client-side encryption buys nothing. These are encrypted on our servers with AES-256 envelope encryption, using a customer-managed key in AWS KMS. We can decrypt them; we say so plainly rather than implying otherwise.

Encryption at rest

ComponentAlgorithmKey management
Client-encrypted contentAES-256-GCMKey travels in the link; with custody, a share created in the browser also has a copy stored sealed to your account key (and your team's key, for team content), and an API create has one stored sealed to your account key alone when a key you granted account custody sends an account_key_wrap. An item_key_wrap can be stored with the share, but nothing in the product reads it back
Server-encrypted contentAES-256 envelope encryptionCustomer-managed key in AWS KMS
Database fieldsAES-256Managed database encryption

Encryption in Transit

How connections to CredenShare are protected:

  • Web app, share and paste hosts: TLS 1.2 or better, and an HSTS header with a one-year max-age and includeSubDomains
  • API endpoints: HTTPS; the official SDKs default to https://api.credenshare.io/v1
  • Internal calls: our functions authenticate to AWS services with scoped IAM roles

Key Management

For shares created from the web, the REST API or an SDK there is no server-side key that can decrypt them. The content key is generated in the client and never reaches us in the clear. For a share created in the browser, zero-knowledge custody also stores a copy of it, sealed to your account key (and, for team content, to your team's key). We hold those keys only sealed under secrets we do not keep — your passphrase, which never reaches us, or the custody secret of an API key you have granted account custody, which we generate when the key is created, return to you once and never store — so we cannot open any of it.

An item_key_wrap sent with a REST API or SDK create can be stored with the share too, wrapped to that API key's custody public key, but nothing in the product reads it back: the dashboard does not use it to open the share or rebuild its link. A copy the dashboard can use comes from an account_key_wrap instead: the content key wrapped to your account key, sent on a REST API create by a key you granted account custody.

Server-encrypted (Slack) shares use envelope encryption: a new data key is generated for every encryption operation, and the master key that wraps it is customer-managed in AWS KMS.

Data Lifecycle

Client-encrypted shares — web, REST API and SDKs

Encrypt in client → Store ciphertext → Serve ciphertext → Decrypt in browser → Delete
  1. Encrypt: the client generates a content key and encrypts the fields
  2. Store: we store the ciphertext plus a hash of an access token
  3. Serve: we return the ciphertext to whoever presents the link
  4. Decrypt: the recipient's browser decrypts using the key in the URL fragment
  5. Delete: at expiration the ciphertext is deleted

Server-encrypted (Slack) shares

Create → Encrypt → Store → Access → Decrypt → Display → Delete
  1. Create: the credential arrives from the Slack dialog
  2. Encrypt: the server encrypts it with a per-share data key wrapped by KMS
  3. Store: the encrypted credential is saved to the database
  4. Access: the recipient visits the share URL
  5. Decrypt: the server asks KMS to unwrap the data key
  6. Display: the plaintext credential is shown to the recipient
  7. Delete: once expired or consumed, the encrypted data is deleted
Expired credential ciphertext is deleted from the live database within an hour. Database backups roll off on their own retention schedule — 7 days in production.