Mam ten kod od http://www.ravenblast.com/index.php/blog/android-password-text-encryption/ i chociaż działa, mam rosnące podejrzenie, że nie jest wystarczająco bezpieczny. Nie ma żadnego wektora inicjalizacyjnego, który wydaje się konieczny z innych źródeł.Czy to szyfrowanie AES jest wystarczająco bezpieczne?
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);
}
Potrzebujesz IV i MAC. Posiadanie MAC w schemacie encrypt-then-mac lub użycie specjalistycznego uwierzytelnionego szyfrowania jest bardzo ważne, gdy spotykasz się z aktywnym napastnikiem. Inaczej prawdopodobne jest, że atakujący może cię oszukać, aby odszyfrować wiadomość dla niego. Padding wyrocznie to praktyczny atak. Jeśli to jest ECB (nie jestem dostatecznie zaznajomiony z interfejsem API, aby to zobaczyć), musisz również przejść do trybu lepszego. – CodesInChaos
Używanie 'getBytes()' również jest złym pomysłem, ponieważ używa kodowania zależnego od platformy/kultury. Zamiast tego użyj UTF-8. – CodesInChaos