Gestió de claus
Generació i destrucció
Consells sobre generació:
- Per a xifrat simètric, utilitzar AES amb almenys 128 bits, millor 256.
- Utilitzar modes autenticats si és possible: GCM, CCM. Aquests modes proporcionen xifrat autenticat, combinant confidencialitat i integritat en una sola operació (sense necessitat d’un MAC separat). Si no, CTR o CBC. ECB hauria d’evitar-se.
- Per a xifrat asimètric, utilitzar criptografia de corba el·líptica (ECC) com Curve25519. Si no, utilitzar RSA d’almenys 2048 bits.
- Utilitzar generadors aleatoris segurs. Millor CSPRNG (Cryptographically Secure Pseudo-Random Number Generator) que PRNG (Pseudo-Random Number Generator). A Java, preferir sempre
SecureRandomsobreRandom.
És important fer que les claus tinguin una durada limitada (rotar-les): generar una nova clau, desxifrar les dades amb l’antiga, rexifrar-les amb la nova, i destruir l’antiga de forma segura. Cal fer rotació de les claus si:
- Si se sap (o se sospita) que la clau anterior ha estat compromesa.
- Quan passi un cert temps predeterminat.
- Quan s’hagi xifrat una certa quantitat de dades.
- Si ha canviat la seguretat associada a un algorisme (nous atacs).
Emmagatzematge
Les aplicacions gestionen diferents tipus de secrets: credencials, claus de xifratge, claus privades de certificats, claus d’API, dades sensibles, etc.
Els secrets s’han de xifrar en repòs i en trànsit. Les claus per xifrar secrets s’anomenen Data Encryption Keys (DEK). Aquestes claus també s’han de protegir, i el que es fa és xifrar-les utilitzant el que es diu Key Encryption Key (KEK) o “Master Key”. Aquest esquema permet modificar la KEK mantenint les DEK, i per tant, sense requerir el rexifratge de les dades.
Consells amb les claus:
- Si és possible, no emmagatzemar mai la KEK. Per exemple, demanar-la interactivament quan calgui utilitzant una Key Derivation Function (KDF).
- Si és factible, utilitzar un HSM (Hardware Security Module).
- Millor no mantenir-les en memòria i en pla.
- Mai guardar-les al codi ni al git.
- Les DEK i les KEK s’han d’emmagatzemar en llocs diferents. Per exemple, la base de dades i el sistema d’arxius, o en màquines diferents.
- Si van a un fitxer, protegir els arxius amb permisos restrictius.
- Fer key stretching des d’una contrasenya per generar la KEK. Per exemple, amb la funció de derivació de claus PBKDF2.
El següent diagrama mostra una KEK/DEK amb vectors d’inicialització (KIV/DIV) i gestionades mitjançant una KDF, que permet generar la KEK a partir d’un password.

KeyStores
Un magatzem de claus, o keystore, és protegit per una contrasenya i pot contenir múltiples entrades identificades per un alias. Cada entrada pot ser:
- Claus: pot ser una clau (asimètrica o simètrica). Si es tracta d’una asimètrica, pot contenir una cadena de certificats.
- Certificats: una clau pública, habitualment l’arrel de CAs de confiança.
Les keystores poden tenir diferents formats (JKS, JCEKS, PKCS12, PKCS11, DKS). Els més utilitzats són:
- JKS (Java Key Store): format propietari de Java. Històricament, el més utilitzat. Extensió jks.
- PKCS#12: format standard. Format recomanat. Extensió p12 o pfx.
Java té una eina anomenada keytool per gestionar magatzems de claus. A continuació es mostren algunes comandes habituals.
Comanda per llistar els continguts d’una keystore:
keytool -list -v -keystore keystore.jks
Comanda per generar un keystore amb una parella de claus:
keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048
Comanda per exportar un certificat d’una keystore:
keytool -export -alias mydomain -file mydomain.crt -keystore keystore.jks
Comanda per importar un certificat a una keystore:
keytool -importcert -file mydomain.crt -keystore keystore.jks -alias mydomain