Sicherer File Tresor

HerrInfo

Aktives Mitglied
Hallo zusammen, ich habe mir überlegt, als Projekt ein Programm zu erstellen, mit welchem ich Files sicher lokal speichern kann, ohne dass jemand an sie herankommt. Die jetzige Idee ist es, die Files mit AES-256-Bit zu verschlüsseln und dann in einem Folder pro User abzulegen. Die User können sich dann ein Passwort ausdenken und bekommen noch ein Salt generiert. Kommen wir jetzt zur eigentlichen Frage: Ist diese Methode sicher? Und kann man irgendwie die Daten lokal speichern, ohne dass sie im Windows-Explorer zu finden sind? Und wie würde ich das Login Fenster machen, wo User sich ganz normal in das Programm einloggen können mit einem weiteren password (wird nicht zur Verschlüsselung benutz), weil ich dieses ja speichern muss, um es abzugleichen.
 

Robert Zenz

Top Contributor
Kommen wir jetzt zur eigentlichen Frage: Ist diese Methode sicher?
Grundsaetzlich Ja, aber...viele, viele Fragen und Fallstricke.

Und kann man irgendwie die Daten lokal speichern, ohne dass sie im Windows-Explorer zu finden sind?
Du kannst sie alle in einer einzigen Datei ablegen. Dann sieht man nur die "Tresor-Datei" wenn man das Dateisystem betrachtet.

Und wie würde ich das Login Fenster machen, wo User sich ganz normal in das Programm einloggen können mit einem weiteren password (wird nicht zur Verschlüsselung benutz), weil ich dieses ja speichern muss, um es abzugleichen.
Idealerweise speicherst du das Passwort nicht, sondern laesst das jedes mal vom Benutzer eingeben. Tatsaechlich musst du das Verschluesselungspasswort gar nicht speichern, es reicht vollkommen wenn du deine "Tresor-Datei" mit einer Markierung versiehst, dann versuchst diese zu entschluesseln und dann pruefst. Also, quasi sowas (Pseudo-Code):

Java:
String password = getPasswordFromUser();
Path safePath = getSafePathOfThatUser();

byte[] first128Bytes = readFirst128BytesFrom(safePath);
byte[] decryptedHeader = decrypt(first128Bytes, password);

if (decryptedHeader.matches("SuperSpecialHeaderToDetermineWhetherDecryptionWorked")) {
    // TODO Correct password.
} else {
    // TODO Wrong Password.
}

---

Das gesagt, wenn du das nicht als Uebung in Kryptographie und Sicherheitsverwaltung entwickeln willst, waere vermutlich eine bereits existierende Loesung besser.

Wie @Dukel bereits sagte, VeraCrypt waere eine Moeglichkeit, gocryptfs eine weitere welche auf Basis von Dateien funktioniert, so auch PicoCrypt. Es gibt noch File Lock PEA welches ein Java Programm ist unter der GPL.
 

HerrInfo

Aktives Mitglied
Vielen Dank für die schnellen Antworten.

Es soll eher eine Übung sein, welche am Ende auch relativ sicher ist. Wenn ich das Ganze in eine Datei speicher, wie kann ich denn dann, wenn User A 2 PDFs speichert und User B 3 Fotos, unterscheiden zwischen den Datei-Arten und welchem User diese gehören?
 

Robert Zenz

Top Contributor
Vielen Dank für die schnellen Antworten.

Es soll eher eine Übung sein, welche am Ende auch relativ sicher ist. Wenn ich das Ganze in eine Datei speicher, wie kann ich denn dann, wenn User A 2 PDFs speichert und User B 3 Fotos, unterscheiden zwischen den Datei-Arten und welchem User diese gehören?
Unterschiedliche Dateien pro Benutzer. Jeder Benutzer bekommt eine eigene "Tresor-Datei" welche man beim Starten auswaehlen muss (oder automatisch gewaehlt wird). Hat den Vorteil dass ein Benutzer auch mehrere mit unterschiedlichen Passwoertern haben kann. So funktioniert zum Beispiel auch KeepassXC.
 

KonradN

Super-Moderator
Mitarbeiter
Es soll eher eine Übung sein
Was genau willst du üben?

Generell ist vieles denkbar bis hin zur Erstellung eines eigenen Filesystems. Aber je nachdem, was du lernen willst, macht das keinen Sinn.

Und auch beim Thema Verschlüsselung: da gibt es bereits sehr viel und je nachdem, was du lernen willst, greifst du dann auf Libaries oder Klassen des Frameworks zu.

Es gibt z.B. den Cryptomator als App und auch als Library …. Das könnte interessant sein, wenn du den Bereich Kryptographie nicht tief einsteigen möchtest.

Und wenn du in das Themengebiet einsteigen möchtest, dann ist vermutlich etwas mehr Theorie sinnvoll. Da steigt man nicht ein und programmiert einfach etwas …

Das wäre so wäre so meine Sicht und Rückfrage.
 

White_Fox

Top Contributor
Es soll eher eine Übung sein, welche am Ende auch relativ sicher ist.
Zur Übung...ok. Ernsthaft einsetzen würde ich das an deiner Stelle aber auf gar keinen Fall, nimm da lieber etwas daß bereits fertig und weit verbreitet (=ausgiebig getestet) ist.

Du wärst nicht der Erste, der ein Programm um einen eigentlich hinreichend sicheren Kryptoalgorythmus herum baut, aber aufgrund ungeschickter Implemementierung irgendein großes Loch in den Zaun reißt. Es ist leicht, irgendetwas vor sich selbst zu sichern. Es vor anderen zu sichern ist deutlich schwerer.
 

HerrInfo

Aktives Mitglied
Was genau willst du üben?
Als eigentlichen Fokus wollte ich mich mit der Implementierung von AES256bit beschäftigen und damit die files verschlüsseln und währenddessen auch etwas in hash einsteigen.
Generell ist vieles denkbar bis hin zur Erstellung eines eigenen Filesystems.
Ein eigenes Filesystem wäre auch denkbar, habe mich damit aber noch garnicht beschäftig.

Verschlüsseln mache ich im Moment wie folgt:
Java:
package net.tim;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;

public class EncryptionService {
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    public static void CipherFile(boolean encrypt,IvParameterSpec iv , SecretKey key,
                                  File inputFile, File outputFile)
            throws IOException, NoSuchPaddingException, NoSuchAlgorithmException,
            InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException,
            IllegalBlockSizeException {

        Cipher cipher = Cipher.getInstance(ALGORITHM);

        if (encrypt) {
            cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        } else {
            cipher.init(Cipher.DECRYPT_MODE, key, iv);
        }
        FileInputStream inputStream = new FileInputStream(inputFile);
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        byte[] buffer = new byte[64];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byte[] output = cipher.update(buffer, 0, bytesRead);
            if (output != null) {
                outputStream.write(output);
            }
        }
        byte[] outputBytes = cipher.doFinal();
        if (outputBytes != null) {
            outputStream.write(outputBytes);
        }
        inputStream.close();
        outputStream.close();
    }

    public static void CipherFile(boolean encrypt, File inputFile, File outputFile, User user, String password) {
        try {
            SecretKey key = getKeyFromPassword(password, new String(user.getSalt()));
            IvParameterSpec iv = new IvParameterSpec(user.getIv());
            CipherFile(encrypt, iv, key, inputFile, outputFile);
        } catch (IOException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | InvalidKeySpecException e) {
            e.printStackTrace();
        }
    }

    public static IvParameterSpec generateIv() {
        SecureRandom randomSecureRandom = new SecureRandom();
        byte[] iv = new byte[16];
        randomSecureRandom.nextBytes(iv);
        return new IvParameterSpec(iv);
    }

    public static SecretKey getKeyFromPassword(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
        return new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
    }

    //Method to generate a random salt
    public static String getSalt() {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        return new String(salt);
    }

    //Generate a Hash from a password
    public static String getHash(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 65536, 256);
        byte[] hash = factory.generateSecret(spec).getEncoded();
        return Base64.getEncoder().encodeToString(hash);
    }
}

Wie könnte ich denn ein fertiges Programm testen, ich habe ein paar Ideen für Schwachstellen aber wie genau kann ich diese testen? JUnit Tests prüfen ja nur die Funktionen und diese Funktionieren einwandfrei.
 

HerrInfo

Aktives Mitglied
Ich glaube, die Verschlüsselung ist sicher, da AES als im Moment nicht mit Bute-Force lösbar gilt. Deshalb könnte ich mir vorstellen, dass ein Problem das Login field seien kann, wo man das Password eingibt (anfällig gegenüber Keyloggern) eine weite Schwachstelle könnte code Injektion sein, wüsste aber nicht, wie man sich dagegen absichert. Projekt: https://github.com/Ghoastplayer/SecureFileVault
 

Robert Zenz

Top Contributor
Deshalb könnte ich mir vorstellen, dass ein Problem das Login field seien kann, wo man das Password eingibt (anfällig gegenüber Keyloggern) eine weite Schwachstelle könnte code Injektion sein, wüsste aber nicht, wie man sich dagegen absichert.
Gar nicht, entweder du vertraust der Client-Umgebung, oder nicht. Weil egal was du einbaust, der Client kann immer noch darueber hinweg. Wenn du die Client-Umgebung "validieren" willst, bist du unmittelbar im selben Bereich wie "Client Anti-Cheat" Loesungen, und Googles Play Integrity. Also kurzum, entweder du installierst ein Root-Kit auf dem System und vertraust dass die Hardware nicht zerbrochen ist, oder du vertraust nur der Hardware, aber dann musst du eben auch die Hardware stellen (und 100% ist das theoretisch auch wieder nicht), oder du vertraust dem System einfach, weil dagegen verteidigen kannst du dich ohnehin nicht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Ist Java intrinsisch 'sicherer' als zum Beispiel C/C++ ? Allgemeine Java-Themen 2
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
M File einlesen während es beschrieben wird.. Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben