2012-03-05 5 views
11

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?

+0

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

+0

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. –

+0

Qualche problema con le risposte Eric? –

risposta

11

Si consiglia di utilizzare la crittografia in modalità GCM. È incluso nell'ultimo JDK (1.7) per impostazione predefinita. Utilizza una crittografia in modalità contatore (un codice di flusso, senza riempimento) e aggiunge un tag di autenticazione. Un grande vantaggio è che richiede solo una singola chiave, mentre HMAC aggiunge un'altra chiave al mix. Bouncy Castle ha anche un'implementazione, che è mosily compatibile con quella fornita da Oracle.

La crittografia in modalità GCM è anche presente in un TLS RFC e in XML encrypt 1.1 (entrambi non definitivi). La modalità GCM offre tutte e tre le funzionalità di sicurezza: riservatezza, integrità e autenticità dell'invio dei dati. La stringa sarebbe "AES/GCM/NoPadding" invece di CBC che si sta ora distribuendo. Come detto, assicurati di avere l'ultimo JDK di Oracle o di installare il provider di Bouncy Castle.

Controllare anche la mia risposta here, che è principalmente sulla codifica String, ma ho provato con successo anche la modalità GCM - vedere il commento.

+0

Come qualsiasi codice di streaming, fai attenzione a come usi il NONCE/IV , come lo stesso valore porterà a insicurezze. –

+0

Sì, penso che questa sia la migliore risposta a tutte le cose considerate. Sono costretto a utilizzare JDK 1.6, quindi sono andato con una soluzione che esegue il rafforzamento della chiave basato su password per generare una chiave a 256 bit. Prendo i primi 128 bit della chiave e lo uso per crittografare usando AES CBC e quindi uso gli ultimi 128 bit per il testo cifrato di MAC. –

+0

@EricConner non dimenticare di MAC anche il vettore di inizializzazione! – MauganRa

3

Durante il trasferimento di file da un server a un altro tramite ftp protetto, utilizzo coppie di chiavi private/pubbliche con la chiave privata che risiede sul server "da" e la chiave pubblica che risiede sul server "a".

L'utilizzo di coppie di chiavi private/pubbliche è uno standard sicuro durante il trasferimento dei file.

Credo che sarebbe anche un mezzo sicuro nel contesto di un'applicazione Java.

Verificare Generating and Verifying Signatures e Generate Public and Private Keys per ulteriori dettagli sull'utilizzo di una configurazione di coppia di chiavi privata/pubblica per le firme digitali in Java.

+0

OK, questo è un caso d'uso completamente nuovo, ma ero un po 'duro. Le firme e PKI * sono * un metodo valido per il controllo e l'autenticazione dell'integrità, ma è un modo piuttosto pesante di calcolare un MAC. –

+1

@owlstead - Ricordo brevemente il tuo commento originale ma non riesco a vederlo ora perché sembra che sia stato eliminato. Nessuna preoccupazione in entrambi i casi. Ho avuto diverse persone a svalutare le mie risposte e capisco perché in diversi casi. Spero che più gente si sottometta per il motivo che si vede quando si sorvola il downvote - "Questa risposta non è utile".In questo caso, credo davvero che la mia risposta potrebbe aiutare l'OP ed è per questo che l'ho pubblicata. Dio non voglia che qualcuno di noi butterebbe qualcosa lì per punti. Dovremmo tutti sforzarci di aiutarci a vicenda in fin dei conti ... –

+0

Precisamente, è per questo che ho pensato che fosse piuttosto duro, a volte devo smettere di essere troppo negativo a volte. Non sono sicuro che FTP e RSA siano ciò che Eric cercava, ma non è errato, quindi la risposta dovrebbe essere lasciata in lotta per il proprio ... –

Problemi correlati