2017-10-29 1 views
0

Ich habe diesen Code geschrieben, der Strings in AES/CBC verschlüsselt und entschlüsselt, weil ich gewarnt wurde, dass es sicherer ist als AES/ECB.Ich versuche, geheime Strings in meinem Code zu schützen, habe ich alles richtig gemacht?

private static final String IV = "nVj1Vakka8jaVn9d"; 

private static final String AES_MODE = "AES/CBC/PKCS7Padding"; 
private static final String CHARSET = "UTF-8"; 

public static String encrypt(String message, String password) { 
    try { 
     byte[] messageBytes = message.getBytes(CHARSET); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
     byte[] cipherText = cipher.doFinal(messageBytes); 

     return Base64.encodeToString(cipherText, Base64.NO_WRAP); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

public static String decrypt(String base64EncodedCipherText, String password) { 
    try { 
     byte[] encodedBytes = Base64.decode(base64EncodedCipherText, Base64.NO_WRAP); 
     SecretKeySpec key = new SecretKeySpec(password.getBytes(CHARSET), AES_MODE); 
     IvParameterSpec ivSpec = new IvParameterSpec(IV.getBytes(CHARSET)); 

     Cipher cipher = Cipher.getInstance(AES_MODE); 
     cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
     byte[] decryptedBytes = cipher.doFinal(encodedBytes); 

     return new String(decryptedBytes, CHARSET); 
    } catch(Exception ex) { 
     return null; 
    } 
} 

Meine Anwendung enthält geheime Zeichenfolgen, die von Decompilern nicht angezeigt werden sollten. Alle diese Zeichenfolgen werden in String-Feldern durch die Rückgabe dieser Verschlüsselungsmethode verschlüsselt. The IV in der Theorie ist nicht geheim, dann lege ich es einfach als String-Feld in der Klasse, das Passwort wird sicher von Firebase bei Bedarf wiederhergestellt und wird nie in SharedPreferences oder Code gespeichert.

Habe ich alles richtig gemacht?

+3

Sieht aus wie eine Anfrage für [codereview.se]. – shmosel

+0

1. Die IV muss für jede Verschlüsselung einen anderen zufälligen Wert haben, im Allgemeinen wird sie den verschlüsselten Daten vorangestellt. 2. Dies schlägt fehl für einen Angriff auf den laufenden Code, in dem sich der Entschlüsselungsschlüssel befindet. 3. Es ist auch notwendig, dass der Schlüssel im Speicher nach der Verwendung überschrieben wird, nicht nur freigegeben, dies kann schwierig sein. – zaph

+0

warum nicht mit Hashing statt Verschlüsselung und Entschlüsselung gehen? – user641887

Antwort

0

Sie können einen gesalzenen und iterierten kryptografischen Hash verwenden. Die tatsächliche Antwort wird niemals im Code enthalten sein.

Führen Sie die Antwort durch eine Funktion wie PBKDF2, Rfc2898DeriveBytes, Bcrypt oder ähnliche Funktionen während der Entwicklung und fügen Sie das Ergebnis + Salz zum Code hinzu. Es ist nicht reversibel und resistent gegen Brute-Force-Angriffe.

Im Code nehmen die Benutzer die Antwort und führen sie durch die gleiche Methode mit dem gleichen Salz und vergleichen Sie die Ergebnisse.

Verwandte Themen