it-swarm.com.de

Wie verschlüsselt und entschlüsselt man Dateien in Android?

Ich möchte die Datei verschlüsseln und auf der SD-Karte speichern. Ich möchte diese verschlüsselte Datei entschlüsseln und sie erneut auf der SD-Karte speichern. Ich habe versucht, die Datei zu verschlüsseln, indem ich sie als Dateistream öffne. Die Verschlüsselung funktioniert jedoch nicht. Ich möchte eine Idee, wie das geht.

64
Pratik

Verwenden Sie ein CipherOutputStream oder CipherInputStream mit einem Cipher und Ihrem FileInputStream / FileOutputStream .

Ich würde so etwas wie Cipher.getInstance("AES/CBC/PKCS5Padding") vorschlagen, um die Klasse Cipher zu erstellen. Der CBC-Modus ist sicher und hat nicht die Schwachstellen des EZB-Modus für nicht zufällige Klartexte . Es sollte in jeder generischen kryptografischen Bibliothek vorhanden sein, um eine hohe Kompatibilität zu gewährleisten.

Vergessen Sie nicht, ein Initialisierungsvektor (IV) zu verwenden, das von einem sicheren Zufallsgenerator generiert wurde, wenn Sie mehrere Dateien mit demselben Schlüssel verschlüsseln möchten. Sie können der Ebene IV am Anfang des Chiffretexts ein Präfix voranstellen. Es ist immer genau ein Block (16 Byte) groß.

Wenn Sie ein Kennwort verwenden möchten, stellen Sie sicher, dass Sie einen guten Mechanismus zur Schlüsselableitung verwenden (suchen Sie nach kennwortbasierter Verschlüsselung oder kennwortbasierter Schlüsselableitung). PBKDF2 ist das am häufigsten verwendete passwortbasierte Schlüsselableitungsschema und es ist in den meisten Java= Runtimes vorhanden, einschließlich Android. Beachten Sie, dass SHA-1 eine etwas veraltete Hash-Funktion ist , aber es sollte in PBKDF2 in Ordnung sein und bietet derzeit die am besten kompatible Option.

Geben Sie immer die Zeichencodierung an, wenn Sie Zeichenfolgen codieren/decodieren. Andernfalls treten Probleme auf, wenn sich die Plattformcodierung von der vorherigen unterscheidet. Verwenden Sie mit anderen Worten nicht String.getBytes(), sondern String.getBytes(StandardCharsets.UTF_8) .

Um die Sicherheit zu erhöhen, fügen Sie die kryptografische Integrität und Authentizität hinzu, indem Sie eine sichere Prüfsumme (MAC oder HMAC) über den Chiffretext und IV einfügen, vorzugsweise mit einem anderen Schlüssel. Ohne ein Authentifizierungs-Tag kann der Chiffretext so geändert werden, dass die Änderung nicht erkannt werden kann.

Seien Sie gewarnt, dass CipherInputStream may nicht melden BadPaddingException, dies schließt BadPaddingException ein, die für authentifizierte Chiffren wie GCM generiert wurden. Dies würde die Streams für diese Art von authentifizierten Chiffren inkompatibel und unsicher machen.

63
Maarten Bodewes

Ich hatte ein ähnliches Problem und für das Ver-/Entschlüsseln habe ich diese Lösung gefunden:

public static byte[] generateKey(String password) throws Exception
{
    byte[] keyStart = password.getBytes("UTF-8");

    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    sr.setSeed(keyStart);
    kgen.init(128, sr);
    SecretKey skey = kgen.generateKey();
    return skey.getEncoded();
}

public static byte[] encodeFile(byte[] key, byte[] fileData) throws Exception
{

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(fileData);

    return encrypted;
}

public static byte[] decodeFile(byte[] key, byte[] fileData) throws Exception
{
    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);

    byte[] decrypted = cipher.doFinal(fileData);

    return decrypted;
}

So speichern Sie eine verschlüsselte Datei auf SD Do:

File file = new File(Environment.getExternalStorageDirectory() + File.separator + "your_folder_on_sd", "file_name");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
byte[] yourKey = generateKey("password");
byte[] filesBytes = encodeFile(yourKey, yourByteArrayContainigDataToEncrypt);
bos.write(fileBytes);
bos.flush();
bos.close();

So dekodieren Sie eine Datei:

byte[] yourKey = generateKey("password");
byte[] decodedData = decodeFile(yourKey, bytesOfYourFile);

Zum Einlesen einer Datei in ein Byte-Array gibt es da einen anderen Ausweg. Ein Beispiel: http://examples.javacodegeeks.com/core-Java/io/fileinputstream/read-file-in-byte-array-with-fileinputstream/

50
ZeroTek

Sie können Java-aes-crypto oder Facebooks Conceal verwenden

Java-aes-crypto

Zitat aus dem Repo

Eine einfache Klasse Android zum Ver- und Entschlüsseln von Zeichenfolgen mit dem Ziel, die klassischen Fehler zu vermeiden, unter denen die meisten Klassen leiden.

Facebooks verbergen

Zitat aus dem Repo

Conceal bietet einfache Android APIs für die schnelle Verschlüsselung und Authentifizierung von Daten

0
user158