La crittografia autenticata richiede l'utilizzo di alcuni standard accettati per la crittografia e l'autenticazione di un messaggio. Quindi entrambi criptiamo il messaggio e calcoliamo un MAC sul messaggio per verificare che non sia stato manomesso.Qual è il modo corretto di eseguire la crittografia autenticata in Java?
This question delinea un modo per eseguire rafforzamento chiave base con password e crittografia:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
Ma per quanto ne so, questo non calcola alcuna MAC sul testo cifrato e così sarebbe insicuro. Qual è lo standard accettato per l'esecuzione della crittografia autenticata in Java?
Se si cripta/decodifica il messaggio completo si sa che non è stato manomesso no !? HMAC non viene utilizzato quando si desidera inviare un messaggio (o dati) in "testo normale" e quindi inviare l'HMAC insieme per autenticare il testo normale? – TacticalCoder
Non esiste uno standard accettato per eseguire la crittografia autenticata, potrebbe essere firme (asimmetriche), MAC (ad esempio AESCMAC), HMAC o modalità autenticate. Tuttavia, alcuni sono pericolosi (per impostazione predefinita, ad esempio, AES-MAC non è molto sicuro). Vedi sotto per una buona risposta che dovrebbe adattarsi al tuo caso d'uso. –
Qualche problema con le risposte Eric? –