2015-03-25 7 views
7

Ich implementiere und AES-Verschlüsselung für PBE in Android, und ich habe zwei Möglichkeiten gefunden, um die Schaffung der IV zu implementieren, und ich möchte wissen, welche besser und sicherer ist für das erhalten IvParameterSpec:Generieren von zufälligen IV für AES in Java

Methode 1:

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

IvParameterSpec ivParams = new IvParameterSpec(iv); 

Methode # 2:

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

ivParams = new IvParameterSpec(iv2); 

Antwort

10

Verwendung Methode 1, weil die Java API gibt die folgenden für die Cipher.init() API, die den Verschlüsselungs-/Entschlüsselungs-Modus und Schlüssel nur nimmt:

Wenn diese Chiffre Instanz jeder Algorithmus-Parameter oder Zufallswerte benötigt, die das spezifizierter Schlüssel kann nicht liefern, die zugrunde liegende Implementierung dieses Chiffre soll die erforderlichen Parameter generieren (mit seinem Provideroderzufällige Werte).

(Hervorhebung von mir)

Es ist auch transparenter, was auf die Augen auf und einfacher wird. Ich würde jedoch new SecureRandom() anstelle eines spezifischen Algorithmus für den Zufallsgenerator verwenden. Lassen Sie die Plattform herausfinden, welcher der beste ist.

im Android Quellcode Blick scheint es, dass zumindest einige Versionen (einschließlich Version 21?) Nicht eine zufällige IV schaffen - die zufällige IV Schöpfung aus scheint kommentiert ...

+0

ich es testen, morgen , momentan kann ich nicht. Danke – user1576396

+0

Ich habe den Code wie folgt geändert: SecureRandom random = SecureRandom.getInstance (PRNG_ALGO); random = neu SecureRandom(); Log.d ("generateSalt", "Algorithmus ausgewählt von SO:" + random.getAlgorithm()); Das Protokoll zeigt dies: D/generateSalt: Algorithmus von SO gewählt: SHA1PRNG SO der Algo gewählt ist SHA1PRNG – user1576396

+0

Das ist toll, aber SHA1PRNG ist schlecht definiert und kann sich über Implementierungen unterscheiden. Selbst wenn es verfügbar ist, ist es möglicherweise nicht die beste verfügbare Option für Sicherheit und Effizienz. Wie angegeben, würde ich stattdessen den Konstruktor "no-arguments" für "SecureRandom" verwenden. –

Verwandte Themen