Generate cryptographically secure session keys
Session keys must be unpredictable and unique per session. Learn to generate them using a CSPRNG and derive sub-keys with HKDF.
- 1
A session key is a fresh symmetric key generated for a single session. It must come from a CSPRNG (cryptographically secure pseudorandom number generator) — never Math.random(). For TLS, the session key is derived via ECDHE; for application-level, generate 256 random bits.
- 2 Random Bytes Generator →
Generate 32 bytes (256 bits) of cryptographically secure random data. This is your session key. Use the Web Crypto API (crypto.getRandomValues) or Node.js crypto.randomBytes — never Math.random() or Date.now().
- 3 HMAC Generator →
Derive sub-keys from the master session key using HKDF (HMAC-based Key Derivation Function). For example, derive separate keys for encryption and MAC: K_enc = HKDF(master, "encryption"), K_mac = HKDF(master, "mac").
- 4 AES Encryptor →
Use the derived encryption key to protect session data. The key exists only in memory for the session duration and is zeroed on logout or session timeout.
- 5
For forward secrecy, generate a new ephemeral key pair per session, exchange public keys via Diffie-Hellman, and derive the session key from the shared secret. Discard the ephemeral keys after the session — past sessions cannot be decrypted even if long-term keys are compromised.
Frequently asked questions
- Why not use Math.random()?
- Math.random() is not cryptographically secure — its output is predictable with enough observations. It uses a PRNG (not CSPRNG) that can be reverse-engineered. Always use crypto.getRandomValues() (browser) or crypto.randomBytes() (Node.js).
- What is HKDF and why use it?
- HKDF (RFC 5869) expands a master key into multiple independent sub-keys using HMAC. It ensures that compromising one sub-key does not reveal others. Use it to derive separate keys for encryption, authentication, and IV generation from a single master key.
Workflows that solve this
Learn more
Want to understand why?