0Pricing
Java Academy · Lezione

Crittografia simmetrica AES

Cifri e decifri dati sensibili con AES/CBC/PKCS5Padding usando l'API javax.crypto di Java.

Crittografia simmetrica AES è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Cifratura simmetrica e asimmetrica

La cifratura simmetrica usa la stessa chiave per cifrare e decifrare (è veloce e adatta a grandi quantità di dati). Quella asimmetrica usa una coppia di chiavi pubblica/privata (è più lenta ed è utilizzata per lo scambio di chiavi e le firme). AES è il cifrario simmetrico standard.

Modalità AES: CBC e GCM

AES dispone di diverse modalità. AES/CBC/PKCS5Padding è comune, ma non include l'autenticazione. AES/GCM/NoPadding fornisce sia cifratura sia autenticazione (AEAD) ed è fortemente preferibile per il nuovo codice.

Generazione di una chiave AES

Utilizzi KeyGenerator per generare in modo sicuro una chiave AES da 256 bit.

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");

Cifratura AES/GCM

La modalità GCM richiede un vettore di inizializzazione (IV) univoco di 12 byte per ogni cifratura. Generi un nuovo IV casuale per ogni operazione di cifratura: non riutilizzi mai un IV con la stessa chiave.

byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)

Decifratura AES/GCM

Estragga l'IV dai dati memorizzati, ricostruisca la specifica e decifri. GCM verifica automaticamente l'autenticità: i dati manomessi provocano una AEADBadTagException.

// Assume stored = iv + ciphertext:
byte[] iv         = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tampered

Memorizzazione dell'IV insieme al testo cifrato

L'IV non è segreto: lo memorizzi anteposto al testo cifrato o insieme a esso. Il destinatario ha bisogno dell'IV per decifrare. La chiave deve rimanere segreta.

byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv,         0, encryptedData, 0,          iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);

Derivazione della chiave dalla password (PBKDF2)

Non usi mai direttamente una password come chiave AES: la sua entropia è troppo bassa. Derivi una chiave con PBKDF2 usando un salt casuale e un numero elevato di iterazioni.

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

Utilizzo del provider di sicurezza Java

Il provider predefinito del JDK gestisce AES. Per algoritmi aggiuntivi o la conformità FIPS, utilizzi il provider Bouncy Castle.

// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");

Pattern della cifratura envelope

Cifri i dati con una chiave di cifratura dei dati (DEK) generata casualmente. Cifri la DEK con una chiave di cifratura delle chiavi (KEK) memorizzata in un KMS (AWS KMS, HashiCorp Vault). In questo modo limita l'esposizione delle chiavi.

AES nelle applicazioni Spring

TextEncryptor di Spring Security o il modulo Spring Security Crypto forniscono una cifratura AES di alto livello senza dover gestire manualmente Cipher/IV.

TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);

Errori comuni

Non faccia mai quanto segue: riutilizzare un IV con la stessa chiave, usare la modalità ECB (che preserva i pattern), usare direttamente una password come chiave o ignorare il tag di autenticazione. Per il nuovo codice utilizzi sempre GCM.

Verifica rapida

Che cosa fornisce AES/GCM che AES/CBC non fornisce?

Riepilogo

Utilizzi AES/GCM/NoPadding per la cifratura autenticata. Generi un nuovo IV casuale di 12 byte per ogni cifratura. Anteprima l'IV al testo cifrato. Derivi le chiavi dalle password con PBKDF2. Non riutilizzi mai un IV con la stessa chiave.

Domande Frequenti

La lezione «Crittografia simmetrica AES» è gratuita?

Sì — il testo completo di «Crittografia simmetrica AES» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Crittografia simmetrica AES»?

Cifri e decifri dati sensibili con AES/CBC/PKCS5Padding usando l'API javax.crypto di Java. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Crittografia simmetrica AES»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Hash crittografico con MessageDigest
  2. Crittografia simmetrica AES
  3. HMAC-SHA256 per l'integrità dei messaggi
  4. JWT: struttura, creazione e verifica
← Torna a Java Academy