Verwenden Sie ein CipherOutputStream
oder CipherInputStream
mit einem Cipher
und Ihrem FileInputStream
/ FileOutputStream
.
Ich würde so etwas wie Cipher.getInstance("AES/CBC/PKCS5Padding")
zum Erstellen der Cipher
Klasse vorschlagen . Der CBC-Modus ist sicher und weist nicht die Schwachstellen des EZB-Modus für nicht zufällige Klartexte auf . Es sollte in jeder generischen kryptografischen Bibliothek vorhanden sein, um eine hohe Kompatibilität zu gewährleisten.
Vergessen Sie nicht, einen von einem sicheren Zufallsgenerator generierten Initialisierungsvektor (IV) zu verwenden, wenn Sie mehrere Dateien mit demselben Schlüssel verschlüsseln möchten. Sie können die einfache IV am Anfang des Chiffretextes voranstellen. Es ist immer genau ein Block (16 Bytes) groß.
Wenn Sie ein Kennwort verwenden möchten, stellen Sie bitte 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 Kennwortbasierte Schlüsselableitungsschema und ist in den meisten Java-Laufzeiten , einschließlich Android, vorhanden. Beachten Sie, dass SHA-1 eine etwas veraltete Hash-Funktion ist, in PBKDF2 jedoch in Ordnung sein sollte und derzeit die am besten kompatible Option darstellt.
Geben Sie beim Codieren / Decodieren von Zeichenfolgen immer die Zeichencodierung an. Andernfalls treten Probleme auf, wenn sich die Plattformcodierung von der vorherigen unterscheidet. Mit anderen Worten, nicht verwenden, String.getBytes()
sondern verwenden String.getBytes(StandardCharsets.UTF_8)
.
Um die Sicherheit zu erhöhen, fügen Sie bitte kryptografische Integrität und Authentizität hinzu, indem Sie eine sichere Prüfsumme (MAC oder HMAC) über den Chiffretext und IV hinzufü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
möglicherweise keine Meldung BadPaddingException
erfolgt. Dies gilt auch BadPaddingException
für authentifizierte Chiffren wie GCM. Dies würde die Streams für diese Art von authentifizierten Chiffren inkompatibel und unsicher machen.