2013-02-18 23 views
6

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); 
} 
+2

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

+2

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

Odpowiedz

9

Tak, to nie jest bardzo bezpieczne. Nie ma IV, ponieważ nie ma blokowania łańcucha.

Algorytm AES może szyfrować tylko bloki 128 bajtów, bez względu na rozmiar klucza (nie ma to związku). Sposób łączenia tych bloków jest kolejnym problemem. Najprostszym sposobem jest zaszyfrowanie każdego bloku oddzielnie od pozostałych (ECB mode), tak jakby były oddzielnymi wiadomościami. Artykuł w Wikipedii, który łączyłem, mówi ci, kiedy i dlaczego to nie jest bezpieczne, i preferowane są inne metody (mianowicie CBC mode).

Po wykonaniu Cipher cipher = Cipher.getInstance("AES"); otrzymasz szyfr AES w ECB mode. Nie ma bezpośredniego zagrożenia, ale jeśli wiadomości mają powtarzające się wzory może to prowadzić do sytuacji, jak następuje:

oryginalny: enter image description here Szyfrowane: encrypted

Powiązane problemy