2015-03-25 15 views
7

Implementazione e motore di crittografia AES per PBE in Android, e ho trovato due modi per implementare la creazione di IV e vorrei sapere quale è migliore e più sicuro per ottenere IvParameterSpec:Generazione di IV casuali per AES in Java

Metodo # 1:

SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG"); 
byte[] iv = new byte[cipher.getBlockSize()]; 
randomSecureRandom.nextBytes(iv); 

IvParameterSpec ivParams = new IvParameterSpec(iv); 

Metodo # 2:

AlgorithmParameters params = cipher.getParameters(); 
byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV(); 

ivParams = new IvParameterSpec(iv2); 

risposta

10

Usa metodo # 1, perché l'API Java specifica quanto segue per il Cipher.init() API che vuole solo la modalità di codifica/decodifica e la chiave:

Se l'istanza di cifratura ha bisogno di alcun parametro algoritmo o valori casuali che la la chiave specificata non può fornire, l'implementazione sottostante di questo cifrario dovrebbe generare i parametri richiesti (utilizzando il suo providerovalori casuali).

(sottolineatura mia)

E 'anche più trasparente ciò che sta succedendo e facile per gli occhi. Vorrei comunque usare new SecureRandom() invece di specificare un algoritmo specifico per il generatore di numeri casuali. Lascia che la piattaforma capisca qual è il migliore.

Guardando il codice sorgente di Android, sembra che almeno alcune versioni (tra cui la versione 21?) Non creerà un IV a caso - la creazione IV casuale sembra commentata ...

+0

mi metterà alla prova esso, domani , al momento non sono in grado di farlo. Grazie – user1576396

+0

ho modificato il codice in questo modo: SecureRandom random = SecureRandom.getInstance (PRNG_ALGO); random = new SecureRandom(); Log.d ("generateSalt", "Algorithm scelto da SO:" + random.getAlgorithm()); Il registro mostra questo: D/generateSalt: Algorithm scelto da SO: SHA1PRNG SO l'algo scelto è SHA1PRNG – user1576396

+0

Questo è ottimo, ma SHA1PRNG è mal definito e potrebbe differire tra le implementazioni. Anche se disponibile, potrebbe non essere la migliore opzione disponibile in termini di sicurezza ed efficienza. Come indicato, userei invece il costruttore no-arguments per 'SecureRandom'. –

Problemi correlati