Course contentsShow
← Node.js
Lesson 1814 of 1,98016. Security Hardening and Threat MitigationFree lesson

Encrypting Data at Rest within Applications

Manage application-level encryption keys for sensitive fields stored in persistent storage.

In this lesson, you will learn how to implement application-level encryption for sensitive database fields to ensure that data remains protected even if the physical storage medium or database is compromised.

While full-disk encryption secures the server, Application-Level Encryption (ALE) ensures that sensitive fields—such as PII (Personally Identifiable Information) or financial identifiers—are encrypted before they ever reach the database driver. This creates a "defense-in-depth" layer where the database sees only ciphertext, preventing unauthorized DB administrators or attackers with read-access to the database from viewing plaintext data.

Implementing Encryption via Node.js

To handle this, we typically use the native crypto module. The core requirement is managing two distinct keys: a Data Encryption Key (DEK) used to encrypt the field, and a Key Encryption Key (KEK) used to wrap (encrypt) the DEK for secure storage.

const crypto = require('crypto');

// Using AES-256-GCM for authenticated encryption
const algorithm = 'aes-256-gcm';
const iv = crypto.randomBytes(12); // Initialization Vector
const key = process.env.ENCRYPTION_KEY; // Managed via secret management systems

function encryptField(text) {
  const cipher = crypto.createCipheriv(algorithm, Buffer.from(key, 'hex'), iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  const authTag = cipher.getAuthTag().toString('hex');
  
  // Store the IV and AuthTag with the ciphertext to allow for decryption
  return `${iv.toString('hex')}:${authTag}:${encrypted}`;
}

Key Considerations

  1. Key Rotation: You must never hardcode keys. Rotate your KEKs periodically using a robust Key Management Service (KMS). If your KEK is compromised, the entire dataset is at risk.
  2. Performance: Encryption is CPU-intensive. Limit ALE to specific sensitive fields rather than entire database tables.
  3. Searchability: Once a field is encrypted, standard database WHERE clauses will fail. If you need to query by that value, you must store an additional, non-reversible cryptographic hash (a "blind index") in a separate column to allow lookups without decrypting every record.

Key Takeaway: By encrypting sensitive data at the application layer using robust primitives like AES-GCM, you ensure that your data remains confidential even in the event of a database breach or unauthorized storage access.