# Hashwerte von Files in ein Byte-Array speichern und als Hex ausgeben



## Nie Mehr (6. Dez 2017)

Hallo Liebe Community,

Ich arbeite seit einiger Zeit an einem Programm womit man Hashwerte von Dateien vergleichen kann. Das Grundgerüst ist folgendes:
1. Schritt: Es wird ein Hauptverzeichnis nach allen Files durchsucht
2. Schritt: Es wird ein Hashwert für jede Datei gebildet (SHA-256)
3. Schritt: Die generierten Hashwerte und Dateipfade werden in eine neue Datei geschrieben.

Meine Aufgabe ist nun, die generierten Hashwerte in ein Byte-Array zu speichern und sie in der neuen Datei als Hex auszugeben.

Beim durchforsten des Internets habe ich immer nur Beispiele bzw. Lösungen gefunden, die sich nur auf Hashwerte eines Strings beziehen. Ich bräuchte allerdings eine andere Möglichkeit die Hashwerte in ein Byte-Array zu speichern. Jedoch finde ich dazu keinerlei Hilfe im Internet.

Hier ein Ausschnitt meines Codes, wo ich vermute, dass das Byte Array hinein soll.

```
private BigInteger genHash(File f) throws NoSuchAlgorithmException, FileNotFoundException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
        BigInteger bigInt = null;
        InputStream is = new FileInputStream(f);
        byte[] buffer = new byte[8192];
        int read = 0;
        try {
            while ((read = is.read(buffer)) > 0) {
                digest.update(buffer, 0, read);              
            }
            byte[] sha256sum = digest.digest();
            bigInt = new BigInteger(1, sha256sum);
        } catch (IOException e) {
            throw new RuntimeException("Unable to process file for SHA-256", e);          
        } finally {
            try {
                is.close(); //InputStream is closed      
            } catch (IOException e) {
                throw new RuntimeException("Unable to close input stream for SHA-256 calculation", e); // throws Exception that the program was not able to close the InputStream      
            }
        }
        return bigInt; // return value
    }
```

Ich hoffe Ihr könnt mir helfen, das Problem bzw. die Aufgabe zu lösen.
Bei Rückfragen stehe ich gerne zur Verfügung.

Mit freundlichen Grüßen
Jasmin


----------



## truesoul (6. Dez 2017)

Hallo.


```
byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("SHA-256").digest(b);
```

Grüße


----------



## Nie Mehr (8. Dez 2017)

Hallo,

erst einmal danke für den Vorschlag, ich denke es ist nah an dem dran was ich suche.
Nach längerem testen und rumprobieren komme ich leider immer noch nicht auf das Ergebnis was ich haben möchte.
Zumal ich nur einen Path bei dem Vorschlag oben angeben kann der direkt auf ein File verweist, was ich aber nicht möchte.
Vielleicht hilft es bei der Antwort wenn ich den Rest meines Codes zeige:

```
private FileWriter fw;

    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        new SHA256calc().start();
    }

    public void start() throws IOException, NoSuchAlgorithmException {
        Date date = new Date();
        SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMdd-HHmmss");   File("C:\\Users\\..\\Desktop\\Ordner");
        fw = new FileWriter("C:\\Users\\..\\Desktop\\Hashfiles\\Hashfile" + DATE_TIME_FORMAT.format(date) + ".csv");
        this.searchDir(f);
        fw.close();
        System.out.println("Finish");
    }

    private void searchDir(File f) throws IOException, NoSuchAlgorithmException {
        File[] content = f.listFiles();
        for (File data : content) {
            if (data.isDirectory()) {
                this.searchDir(data);
            } else {
                fw.write(this.genHash(data) + ";" + data.getAbsolutePath() + System.lineSeparator());
            }
        }
    }
```
Da ich in diesem Ordner mehrere Dateien und Unterordner habe, benötige ich eine andere Lösung.
Ich hoffe Ihr könnt mir nochmal helfen.

Mit freundlichen Grüßen
Jasmin


----------



## truesoul (8. Dez 2017)

Hallo.

Also du kannst doch toPath() von data aufrufen?


```
private void searchDir(File f) throws IOException, NoSuchAlgorithmException {
    File[] content = f.listFiles();
    for (File data : content) {
        if (data.isDirectory()) {
            this.searchDir(data);
        } else {
            byte[] b = Files.readAllBytes(data.toPath());
            byte[] hash = MessageDigest.getInstance("SHA-256").digest(b);

            fw.write(hash + ";" + data.getAbsolutePath() + System.lineSeparator());
        }
    }
}
```

Grüße


----------



## Nie Mehr (8. Dez 2017)

Danke für die Hilfe, darauf wäre ich jetzt nicht gekommen. 
Jetzt funktioniert es auch.


----------

