Ho ottenuto questo codice da http://www.ravenblast.com/index.php/blog/android-password-text-encryption/ e, sebbene funzioni, ho un crescente sospetto che non sia abbastanza sicuro. Non c'è alcun vettore di inizializzazione che sembra essere necessario secondo altre fonti.Questa crittografia AES è abbastanza sicura?
public static String encrypt(String toEncrypt, byte[ ] key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[ ] encryptedBytes = cipher.doFinal(toEncrypt.getBytes());
String encrypted = Base64.encodeBytes(encryptedBytes);
return encrypted;
}
public static String decrypt(String encryptedText, byte[ ] key) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] toDecrypt = Base64.decode(encryptedText);
byte[] encrypted = cipher.doFinal(toDecrypt);
return new String(encrypted);
}
È necessario un IV ed un MAC. Avere un MAC in uno schema encrypt-then-mac, o usare una crittografia autenticata specializzata è molto importante quando si affronta un attaccante attivo. Altrimenti è probabile che l'aggressore possa indurti a decifrare un messaggio per lui. Gli oracoli imbottiti sono un attacco pratico. Se si tratta di ECB (non ho familiarità con l'API per vederlo), è necessario passare a una modalità migliore. – CodesInChaos
L'uso di 'getBytes()' è una cattiva idea, poiché utilizza una codifica basata su piattaforma/cultura. Usa invece UTF-8. – CodesInChaos