2009-05-13 3 views
1

Как безопасно удалить файлы в java? Я пробовал код на javafaq.nu, но проблема в том, что вы не можете фактически удалить файл на окнах, как только он был отображен из-за this bug.Как безопасно удалять файлы в java

Затем я попытался использовать только sysinternals sdelete на окнах, но вы должны щелкнуть по соглашению об использовании при первом использовании, которое я хочу избежать.

+1

"нажмите соглашение использования" SDelete может быть автоматизировано с помощью ключа реестра HKEY_CURRENT_USER \ Software \ Sysinternals \ SDelete \ ** EulaAccepted ** в 1 (REG_DWORD) – Myobis

ответ

4

В журналируемой файловой системе, такой как NTFS, на самом деле нет способа безопасно стереть один файл, не вытирая все свободное пространство на диске. Проблема в том, что новые блоки (которые, предположительно, переписываются случайными данными), не гарантируются в том же месте на диске, что и старые.

Утилиты, такие как sdelete, могут работать для вас, но можно просто заменить этот исполняемый файл тем, который ничего не делает, чтобы помешать этому методу защиты.

Для обеспечения безопасности данных единственным реальным решением является полное шифрование накопителя.

0

Возможно, deleteOnExit() по файлу?

+1

Это не поможет, если файл сопоставлен - его нужно будет удалить после выхода процесса JVM. –

15

Я закодирован и попробовал эту функцию, и, казалось, работали:

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(); 
    } 
}