"We encrypt sensitive data at rest" is a sentence I've heard applied to Pega applications that encrypt nothing beyond whatever the database or disk layer already does by default — which protects you against a stolen hard drive and not much else. Pega's actual application-level encryption, Platform Cipher with properties marked for encryption, is a genuinely different and stronger guarantee. It's also narrower than people assume, and the gap between what it sounds like it covers and what it actually covers is where I've seen compliance conversations go sideways.

What gets encrypted, and how you mark it

Encryption in Pega is opt-in at the property level, not applied to the database wholesale. The current best-practice mechanism is a PropertyEncrypt access control policy (available from Pega Platform 7.4 onward, built on attribute-based access control, which is on by default from 8.2) — you create the policy and explicitly list which properties it covers. Once a property is in that list, Pega encrypts it automatically whenever a value is assigned and saved: in the database column, on the clipboard, in logs, and in search indexes. That multi-surface coverage is the actual value — it's not just "the column in the table is unreadable," it's that the value doesn't show up in plain text in a log file or a search index either, which is where a lot of accidental exposure actually happens in practice.

If you're working in an older application, you may still find the pre-7.4 approach — a TextEncrypted property type — doing the same job at the type level instead of via policy. It still works, but PropertyEncrypt is the supported direction, and it's worth migrating to rather than extending the older pattern into new development.

You can also encrypt an entire BLOB column rather than individual properties, which is a coarser but simpler option — the tradeoff is the usual one between granularity and performance: encrypting everything in the blob costs more at read/write time than encrypting the specific properties that actually need it.

What "encrypted" means underneath: Platform Cipher and your own KMS

The cipher itself is configured — which algorithm, and where the key comes from — via prconfig.xml or a Dynamic System Setting (security/cipher/default). The default platform cipher uses AES256-CBC with PKCS7 padding. Where this gets genuinely interesting for regulated environments is that you're not limited to a key Pega manages: Platform Cipher supports bring-your-own-key through an external key management service — AWS KMS, Azure Key Vault, Google Cloud KMS, and HashiCorp Vault are all supported — where you create a keystore that references the external KMS (via a data page) and use your own Customer Master Key rather than a platform-internal one. With AWS KMS specifically, that also gets you both time-based and on-demand key rotation, managed through the KMS rather than through Pega.

That matters for the conversation compliance teams actually want to have: "who controls the key" is frequently the real question behind "is this encrypted," because a key Pega holds on your behalf means Pega — or anyone who compromises Pega's key store — can decrypt your data. A key your own KMS holds, with your own access policies and audit trail on key usage, is a materially different answer.

How key rotation works: why a new key can still read old data

The obvious worry with rotation is that data encrypted yesterday with the old key becomes unreadable once a new key takes over. In practice it doesn't, because a rotated key does not replace the old one — the old key material is kept for decryption, and every piece of ciphertext carries a pointer to the key version that produced it. Two ideas make this work.

1. Keys have versions, and ciphertext remembers which one it used. A KMS key is really a key identity (the ARN, alias, or key name) with one or more versions of key material behind it. When something is encrypted, the output includes metadata naming the version used. On decrypt, the KMS reads that metadata and automatically picks the matching version. Rotation simply adds a new version and makes it the one used for new encryptions; older versions stay available to decrypt older ciphertext.

2. Envelope encryption keeps the big key small and the rotation cheap. Rather than encrypting every record directly with the master key, the common pattern is a two-layer design: data is encrypted with a data encryption key (DEK), and the DEK is itself encrypted ("wrapped") by the master key held in the KMS. The wrapped DEK is stored alongside the data. To read a record, the wrapped DEK is sent to the KMS, which unwraps it using whichever master key version wrapped it, and the DEK then decrypts the data. The master key never leaves the KMS, and the data itself is never re-encrypted just because the master key rotated.

Envelope encryption: reading a record The database holds the encrypted value and a wrapped data key tagged with key version v1. The wrapped key is sent to the KMS, which unwraps it using v1 and returns the data key, which then decrypts the value. Pega database Encrypted property value ciphertext, made with the data key (DEK) Wrapped DEK the DEK, encrypted by the master key tag: wrapped by v1 Your KMS (master key never leaves) Master key v2 current: used for new encryption Master key v1 retained: still unwraps older DEKs 1. send wrapped DEK 2. DEK returned 3. DEK decrypts the value in Pega The KMS reads the tag, so it picks v1 even though v2 is now current

Reading a record: the stored tag tells the KMS which master key version to use, so old data keeps decrypting after rotation.

Put together, a rotation looks like this:

  1. Day 1: master key version 1 wraps DEK-A. Records encrypted under DEK-A are stored with a pointer to "wrapped by v1."
  2. Rotation: the KMS creates version 2 and uses it for all new wrapping and encryption. Version 1 is retained, not deleted.
  3. Later: reading an old record sends its wrapped DEK to the KMS, which sees "v1," unwraps it with v1, and returns the DEK. New records are wrapped with v2. Both coexist indefinitely.
Key rotation timeline Before rotation, records R1 and R2 are wrapped by key v1. After rotation, new record R3 is wrapped by v2 while R1 and R2 are still wrapped by v1. Re-encrypting R1 and R2 under v2 allows v1 to be retired. Before rotation Record R1 Record R2 Master key v1 (current) Everything uses v1. After rotation (v2 created, v1 kept) Record R1 (old) Record R2 (old) Record R3 (new) Master key v1 (retained) Master key v2 (current) R1 and R2 still decrypt through v1. Deleting v1 now would lock them out. New writes use v2. Re-encrypt R1 and R2 under v2, then v1 can retire.

Rotation timeline: new data moves to v2 immediately, old data stays on v1 until it is re-encrypted.

The practical differences between providers are mostly in how automatic this is. With AWS KMS automatic rotation, the key ID and ARN stay the same while the backing key material changes, and old material is retained so existing ciphertext keeps decrypting with no application change. Azure Key Vault and similar services model it as key versions, with the version recorded against what was encrypted. A manual rotation — creating an entirely new key and pointing an alias at it — works the same way conceptually, but the old key must be kept alive and still reachable for as long as any data still depends on it.

Two caveats are worth being deliberate about:

The exact mechanics of how Platform Cipher calls the external KMS (direct encrypt/decrypt calls versus wrapped DEKs) are worth confirming against the Pega documentation for the version in use, but the rotation behavior above is what the KMS side guarantees either way: versioned key material, retained old versions, and ciphertext that records which version it needs.

What this does not protect against

This is the part that gets skipped in the rush to say "yes, we encrypt that":

What I'd tell myself before starting