Generazione di chiavi AES in Android

Attualmente sto lavorando a generare una chiave per la crittografia / decodifica AES. La chiave è basata su una password e un sale random per utente. La mia prima idea era di fare un SecretKeyFactory con l'algorithm "PBKDF2WithHmacSHA1". Il problema è che Android attualmente non lo support.

Fare una certa ricerca ho trovato la risposta da erickson consigliato l'utilizzo di questo algorithm per lo stesso scopo ( crittografia a 256 bit AES ). La mia domanda è come sarebbe diverso il process di crittografia se uso "PBEWITHSHA256AND256BITAES-CBC-BC" invece di "PBKDF2WithHmacSHA1"? Ci sono altre idee su come generare una chiave per AES in android in modo sicuro e non non solo aver hashing la password con il sale al di là della chiave (non credo che l'approccio da seguire).

  • Crittografia AES 128 in Decryption Java in PHP
  • Crittografia con AES-128 in Android e IPhone (risultato diverso)
  • Encrypt / Decrypt string tra Java e PHP
  • crittografia / decrittura android con AES
  • Android 4.2 ha rotto il codice AES per crittografare / decrittografare
  • Decodifica i byte crittografati AES256
  • AES ottiene risultati diversi in iOS (Obj-C) e Android (Java)
  • Server Android e PHP: crittografare e decrittografare i dati
  • IllegalBlockSizeException quando si cerca di crittografare e decifrare una string con AES
  • Encrypt / Decrypt string tra Java e PHP
  • Decadimento lenta di AES in Android
  • Decodifica i byte crittografati AES256
  • 2 Solutions collect form web for “Generazione di chiavi AES in Android”

    Come dice il nome, "PBEWITHSHA256AND256BITAES-CBC-BC" userà SHA256 come HMAC, invece se utilizza SHA1. Poiché questo è un diverso algorithm, genererà una chiave diversa per la password scelta.

    Se decidi / decrivi solo su android, questo dovrebbe essere benissimo.

    Prova questo:

    public static String encrypt(String seed, String cleartext) throws Exception {         byte[] rawKey = getRawKey(seed.getBytes("UTF-16"));         byte[] result = encrypt(rawKey, cleartext.getBytes("UTF-16"));         return toHex(result);     }         public static String decrypt(String seed, String encrypted) throws Exception {         byte[] rawKey = getRawKey(seed.getBytes("UTF-16"));         byte[] enc = toByte(encrypted);         byte[] result = decrypt(rawKey, enc);         return new String(result);         }     private static byte[] getRawKey(byte[] seed) throws Exception {         KeyGenerator kgen = KeyGenerator.getInstance("AES");         SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");         sr.setSeed(seed);       kgen.init(128, sr); // 192 and 256 bits may not be available       SecretKey skey = kgen.generateKey();       byte[] raw = skey.getEncoded();       return raw;     }         private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES");       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);       byte[] encrypted = cipher.doFinal(clear);         return encrypted;     }     private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {       SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");         Cipher cipher = Cipher.getInstance("AES");       cipher.init(Cipher.DECRYPT_MODE, skeySpec);       byte[] decrypted = cipher.doFinal(encrypted);         return decrypted;     }     public static String toHex(String txt) {         return toHex(txt.getBytes());     }     public static String fromHex(String hex) {         return new String(toByte(hex));     }         public static byte[] toByte(String hexString) {         int len = hexString.length()/2;         byte[] result = new byte[len];         for (int i = 0; i < len; i++)             result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();         return result;     }     public static String toHex(byte[] buf) {         if (buf == null)             return "";         StringBuffer result = new StringBuffer(2*buf.length);         for (int i = 0; i < buf.length; i++) {             appendHex(result, buf[i]);         }         return result.toString();     }     private final static String HEX = "0123456789ABCDEF";     private static void appendHex(StringBuffer sb, byte b) {         sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));     } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.