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. 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 que PRNG. A Java, preferir sempre SecureRandom sobre Random.
És important fer que les claus tinguin una durada limitada (rotar-les): desxifrar i rexifrar. 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 (KEY) 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, pot tenir un alias, i pot contenir:
- 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.
Comenda 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