Java - Jak jednoduše ověřit správnost hesla u archivu?
Dobrý den,
Ryze pro příklad jsem vytvořil tento kód
var filechooser = new FileChooser();
filechooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("zipfile", "*.zip"));
var archive = filechooser.showOpenDialog(null);
try {
if (new ZipFile(archive).isEncrypted()) {
System.out.println(correctPassword(archive, "cat.666"));
System.out.println(correctPassword(archive, "cat_666"));
} else {
System.out.println("Without password");
}
} catch (ZipException ex) {
}
public static String correctPassword(File archive, String password) {
try {
var fileHeaders = new ZipFile(archive).getFileHeaders();
var smallest_size = fileHeaders.stream().map(f -> f.getComssedSize()).min(Long::compare).get();
var smallest_file = fileHeaders.stream().filter(f -> f.getCompressedSize() == smallest_size).findFirst().get();
new ZipFile(archive, password.toCharArray()).extractFile(smallest_file, "/tmp_directory");
FileUtils.deleteDirectory(new File("C:/tmp_directory"));
} catch (ZipException ex) {
return password + " is not correct";
} catch (IOException ex) {
System.out.println("bad path");
}
return password + " is correct";
}
Sice to funguje, ale jsou tam dva základní problémy
1. Abych ověřil správnost hesla (pomocí knihovny zip4j), musím to extrahovat. Sice jsem to zjednodušil tak, aby extrahoval pouze jeden soubor a dokonce ten nejmenší, avšak jeho výběr je zbytečně složitý.
2. Smazání celé složky s extrahovaným souborem provádím pomocí knihovny Commons IO. Problém je, že je tam absolutní cesta a ještě musím v případě přejmenování složky to upravit na dvou místech.
Jak to, prosím Vás, zjednoduším?
Děkuji
PS. Čistě pro testování jsem vytvořil zip archiv se třemi soubory s heslem cat_666