2009-05-13 7 views
1

Comment supprimer des fichiers en toute sécurité dans Java? J'ai essayé le code à javafaq.nu, mais le problème est que vous ne pouvez pas réellement supprimer le fichier sur les fenêtres une fois qu'il a été mappé en raison de this bug.Comment supprimer en toute sécurité des fichiers dans Java

Puis j'ai essayé d'utiliser sysinternals sdelete sur Windows, mais vous devez cliquer sur un accord d'utilisation la première fois que vous l'utilisez que je veux éviter.

+1

paramètre "accord d'utilisation cliquez sur" de sdelete peut être automatisé par le registre d'entrée HKEY_CURRENT_USER \ Software \ Sysinternals \ SDelete \ ** EulaAccepted ** à 1 (REG_DWORD) – Myobis

Répondre

4

Sur un système de fichiers de journalisation comme NTFS, il n'existe aucun moyen d'effacer un fichier en toute sécurité sans effacer tout l'espace libre sur le lecteur. Le problème est que les nouveaux blocs (que vous avez probablement écrasés avec des données aléatoires) ne sont pas garantis d'être au même endroit sur le disque que les anciens. Des utilitaires comme sdelete pourraient fonctionner pour vous, mais on pourrait simplement remplacer cet exécutable par un exécutable qui ne fait rien pour contrecarrer cette méthode de défense. Afin de sécuriser vos données, la seule vraie solution que vous avez est de crypter complètement le disque.

0

Peut-être deleteOnExit() sur le fichier?

+1

Cela n'aidera pas si le fichier est mappé - il devra être supprimé après la fermeture du processus JVM. –

15

Je codifiées et essayé cette fonction, et il semblait fonctionner:

public static void secureDelete(File file) throws IOException { 
    if (file.exists()) { 
     long length = file.length(); 
     SecureRandom random = new SecureRandom(); 
     RandomAccessFile raf = new RandomAccessFile(file, "rws"); 
     raf.seek(0); 
     raf.getFilePointer(); 
     byte[] data = new byte[64]; 
     int pos = 0; 
     while (pos < length) { 
      random.nextBytes(data); 
      raf.write(data); 
      pos += data.length; 
     } 
     raf.close(); 
     file.delete(); 
    } 
} 
Questions connexes