Methoden "Leeren" Speicher auf der Festplatte überschreiben

HelloWorld

Mitglied
Hallo Java-community,


Ich möchte ein Programm schreiben, das den "leeren" speicher der festplatte komplett überschreibt.
Oft ist es doch so, dass das Betriebsystem in den Bitfolgen der Speicheradressen nur ein Bitflag setzt um zu symbolisieren, dass diese bitfolge "leer" ist. Allerdings bleiben die eigentlichen daten nach wie vor unverändert. Oder verstehe ich etwas falsch?
Ist es also möglich mit java diese speicherzellen ausfindig zu machen und alle bits einer folge bis auf das flag bit z.b. auf 1 zu setzten?
Wenn ja welche methoden benötige ich?

Danke für jede Antwort.
 

Barista

Top Contributor
Ich habe so was vor langer Zeit mal gemacht, kann Dir aber nicht garantieren, dass die Methode sicher ist:

Datei FileEraser.java:
Java:
package eraser;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;

import util.FragmentStringBuffer;
import util.SimpleRandom;

/**
 * Programm zum sicheren Löschen von Dateien.
 * 
 * Weil evtl. keine Admin-Rechte vorliegen und
 * in Java Low-Level-Aufrufe nur über JNI
 * möglich sind, wird die angegebene Datei 
 * mit  Zufalls-Informationen überschrieben,
 * umbenannt und anschliessend gelöscht.
 * 
 * @author Heiner Kücker
 */
public class FileEraser
{
    public static final int FILE_NAME_LENGTH = 16;

    /**
     * Zufalls-Generator
     */
    //public static final Random random = new Random();

    /**
     * Überschreiben der übergebenen
     * Datei mit zufälligen Bytes.
     * 
     * @param pFile
     * @throws IOException
     */
    public static void overwrite(
            final File pFile )
        throws IOException
    {
        final RandomAccessFile rndmAccsFile =
            new RandomAccessFile(
                    pFile ,
                    "rw" );
        
        final long origSize = 
            rndmAccsFile.length();
        
        // Datei-Grösse obfuskieren durch eine Vergrösserung der Datei
        // auf ein Vielfaches von 1 MByte
        final byte[] randomByteArr = new byte[ 4 * 1024 * 1024 ];
        rndmAccsFile.seek( 0 );
        for ( ; rndmAccsFile.getFilePointer() < origSize ; )
        {
//            random.nextBytes( 
//                    randomByteArr );
            for (int i = 0; i < randomByteArr.length; i++)
            {
                randomByteArr[ i ] = 
                    (byte) SimpleRandom.nextDigit();
            }
            
            rndmAccsFile.write( 
                    randomByteArr );
//            rndmAccsFile.write(
//                    SimpleRandom.nextDigit() );
        }
        
        rndmAccsFile.close();
    }
    
    public static File rename(
            final File pFile )
        throws IOException
    {
        final String newFileName = 
            randomNumStr( FILE_NAME_LENGTH );
        
        final File newFile = 
            new File( 
                    pFile.getParentFile() ,
                    newFileName );
        
        if ( ! pFile.renameTo( 
                newFile ) )
        {
            throw new IOException( "File rename failed: " + pFile + " " + newFile );
        }
        
        return newFile;
    }
    
    /**
     * Erzeugen eines zufälligen aus
     * Zifern bestehenden Strings in 
     * der spezifizierten Länge.
     * 
     * @param pLength gewünschte Länge
     * @return Zufalls-Ziffern-String
     */
    public static String randomNumStr(
            final int pLength )
    {
        final FragmentStringBuffer strBuff = new FragmentStringBuffer();
        while ( strBuff.length() < pLength )
        {
            final int randomInt = 
                //random.nextInt( 10 );
                SimpleRandom.nextDigit();
            strBuff.append( "" + randomInt );
        }
        return strBuff.toStringAndClear().substring( 0, pLength );
    }
    

    /**
     * @param pFile file to delete
     * @throws IOException
     */
    public static void delete(
            final File pFile )
        throws IOException
    {
        // overwrite file with random bytes
        overwrite( pFile );
            
        // rename file to random name
        final File renamedFile = 
            rename( pFile );
        
        // delete file
        if ( ! renamedFile.delete() )
        {
            throw new IOException( "File deletion failed: " + renamedFile );
        }
    }

    /**
     * @param pFileName Name of the file to delete
     * @throws IOException
     */
    public static void delete(
            final String pFileName )
        throws IOException
    {
        final File file = 
            new File( pFileName );
           
        delete( file );
    }

    /**
     * Test.
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args)
        throws IOException
    {
       final String fileName = "C:\\workspace\\ERASER\\data\\Test.txt" ;
       
       delete( fileName );
    }

}
 

Barista

Top Contributor
Datei FolderEraser.java
Java:
package eraser;

import java.io.File;
import java.io.IOException;

/**
 * Programm zum sicheren Löschen von Dateien
 * mit dem {@link FileEraser}.
 * 
 * @author Heiner Kücker
 */
public class FolderEraser
{
    public static void delete(
            final File pFolderFile )
        throws IOException
    {        
        if ( ! pFolderFile.isDirectory() )
        {
            throw new IOException( "File is no folder: " + pFolderFile );
        }
        
        final File[] fileArr = pFolderFile.listFiles();

        for (int i = 0; i < fileArr.length; i++)
        {
            final File file = fileArr[i];
            
            System.out.println( file );
            
            if ( file.isDirectory() )
                // recursiv call
            {
                delete( 
                        file );
            }
            else
            {
                FileEraser.delete( 
                        file );
            }
        }
        
        // finally delete the folder file
        if ( ! pFolderFile.delete() )
        {
            throw new IOException( "File deletion failed: " + pFolderFile );
        }
    }
    
    /**
     * @param pFileName Name of the folder to delete
     * @throws IOException
     */
    public static void delete(
            final String pFileName )
        throws IOException
    {
        final File file = 
            new File( pFileName );
           
        delete( file );
    }

    /**
     * Test.
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args)
        throws IOException
    {
       final String fileName = 
           // "C:\\workspace\\ERASER\\data\\output" ;
           "C:\\erase";
       
       delete( fileName );
    }

}
 

Barista

Top Contributor
Datei SimpleRandom.java:
Java:
package util;

/**
 * Ganz einfacher Zufalls-Generator für
 * Test.
 * 
 * @author Heiner Kücker
 */
public class SimpleRandom
{
    private static double rndDouble = 
        (int) System.currentTimeMillis();
    
    private static double rndOffset = 17.5 / 3.3;
    
    /**
     * Zurückgeben einer Ziffer
     * von 0 und 9.
     * 
     * @return Zufalls-Zahl
     */
    public static int nextDigit()
    {
        rndDouble += rndOffset;
        
        int rndInt = (int) rndDouble;
        
        rndInt = rndInt % 10;
        
        return Math.abs( rndInt );
    }

}
 

Barista

Top Contributor
Datei FragmentStringBuffer.java:
Java:
package util;

import java.util.ArrayList;

/**
 * Ein StringBuffer, der aus einzelnen
 * Teil-Strings besteht.
 * 
 * Erst beim Umwandeln dieses 
 * {@link FragmentStringBuffer} in einen 
 * String mit der toString-Methode
 * werden die Teil-Strings zusammengefügt.
 * 
 * Das hat folgende Vorteile:
 * 
 * Bei einem {@link java.lang.StringBuffer}
 * wird die Kapazität bei jedem Grössen-Sprung
 * verdoppelt, was schneller zu einem
 * {@link OutOfMemoryError} führen kann.
 * 
 * Dieser {@link FragmentStringBuffer} 
 * beansprucht nur den wirklich benötigten
 * Speicherplatz (abgesehen von der internen
 * Liste und der Verwaltung der Teil-Strings).
 * 
 * Identische Teil-Strings können von
 * der JVM als ein String gespeichert 
 * werden {@link java.lang.String#intern()}.
 * (Doch nicht so implementiert, weil das
 * zu einem PermGenSpace-Überlauf führen kann).
 * 
 * Dadurch kann bis zum Zusammenbau der
 * Teil-Strings weiterer Speicherplatz
 * gespart werden.
 * 
 * Nur beim Zusammenbau wird der
 * doppelte Speicherplatz benötigt,
 * was aber durch die Implementierung
 * von {@link java.lang.String} 
 * nicht zu vermeiden ist.
 * 
 * TODO equals, hashCode, clone und compareTo
 * 
 * @author Heiner Kücker
 */
public class FragmentStringBuffer
{
    /**
     * Liste der Teil-Strings
     */
    private ArrayList fragmentList = new ArrayList();
    
    /**
     * Gesamt-Länge aller Teil-Strings
     */
    private int length;

    /**
     * Constructor.
     */
    public FragmentStringBuffer()
    {
        super();
    }

    /**
     * Constructor.
     * @param pStr initialer String
     */
    public FragmentStringBuffer(
            final String pStr )
    {
        super();
        append( pStr );
    }

    /**
     * @return the length
     */
    public int length()
    {
        return this.length;
    }

    /**
     * Anhängen eines Strings.
     * @param pStr anzuhängender String
     */
    public void append(
            final String pStr)
    {
        this.fragmentList.add( 
                // für die Zusammenfassung identischer Teil-Strings sorgen
                pStr
                // Nach dem Hinweis von Jochen Theodorou und Bernd Eckenfels soll man dies nicht machen
                //.intern() 
                );
        
        final long tNewLength = (long) this.length + pStr.length();
// es ist zu unwahrscheinlich, dass der StringBuffer jemals so riesig wird        
//        if ( tNewLength > Integer.MAX_VALUE )
//        {
//            throw new RuntimeException( 
//                    "FragmentStringBuffer size " 
//                    + tNewLength 
//                    + " exceed max size: " 
//                    + Integer.MAX_VALUE );
//        }
        this.length = (int) tNewLength;
    }
    
    /**
     * @param pValue
     */
    public void append(
            final Object pValue)
    {
        append( String.valueOf( pValue ) );
    }

    /**
     * @param pChar
     */
    public void append(
            final char pChar )
    {
        append( String.valueOf( pChar ) );
    }

    /**
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
//        while ( Runtime.getRuntime().freeMemory() < this.length() * 2 )
//        {
//            System.out.println( "FragmentStringBuffer Memory full" );
//            DebugUtil.printStacktraceToSysout();
//            System.gc();
//            Runtime.getRuntime().runFinalization();
//        }
        final char[] chrArr = new char[ this.length ];
        int pos = 0;
        for ( int i = 0 ; i < this.fragmentList.size() ; i++ )
        {
            final String partStr = (String) this.fragmentList.get( i );
            for ( int j = 0 ; j < partStr.length() ; j++ )
            {
                chrArr[ pos++ ] = partStr.charAt( j );
            }
        }
        return new String( chrArr );
    }
    
    /**
     * @return Inhalt als kompletter String
     */
    public String toStringAndClear()
    {
//        while ( Runtime.getRuntime().freeMemory() < this.length() * 2 )
//        {
//            System.out.println( "FragmentStringBuffer Memory full" );
//            DebugUtil.printStacktraceToSysout();
//            System.gc();
//            Runtime.getRuntime().runFinalization();
//        }
        final char[] chrArr = new char[ this.length ];
        int pos = 0;
        for ( int i = 0 ; i < this.fragmentList.size() ; i++ )
        {
            final String partStr = (String) this.fragmentList.get( i );
            
            // Löschen des Teil-Strings
            this.fragmentList.set( i , null );
            
            for ( int j = 0 ; j < partStr.length() ; j++ )
            {
                chrArr[ pos++ ] = partStr.charAt( j );
            }
        }
        clear();
        
        // Achtung: dies verhindert die Wiederverwendung dieses Buffers
        this.fragmentList = null;
        
        return new String( chrArr );
    }

    /**
     * Leeren dieses {@link FragmentStringBuffer}
     */
    public void clear()
    {
        this.fragmentList.clear();
        this.length = 0;
    }

    /**
     * @return empty or not
     */
    public boolean isEmpty()
    {
        return this.length == 0;
    }

    /**
     * @see java.lang.Object#finalize()
     */
    // Nach dem Hinweis von Jochen Theodorou und Bernd Eckenfels soll man dies nicht machen
//    protected void finalize() throws Throwable
//    {
//        // dem Garbage-Collector ein wenig helfen
//        this.fragmentList.clear();
//        super.finalize();
//    }

    /**
     * Test.
     * @param args
     */
//    public static void main(String[] args)
//    {
//        final FragmentStringBuffer strBuff = new FragmentStringBuffer( "abc" );
//        strBuff.append( "def" );
//        strBuff.append( "ghi" );
//        System.out.println( strBuff );
//    }

}

Statt dieser Klasse wäre aber ein StringBuilder auch ok.
 

HelloWorld

Mitglied
Danke für deine schnelle Antwort!

Das Programm funktioniert gut, allerdings löscht es eine vorhandene Datei. Ich will den Speicher überschreiben der vom System als gelöscht angesehen wird, weil das entsprechende flag gesetzt ist. In meinem Fall gibt es dann ja garkeine Datei die als solches erkannt wird und wie in deinem Programm mit
Java:
final String fileName = "C:\\Programmierung\\workspace\\SecureFileEraser\\data\\Test.txt" ;
eingelesen wird.
Verstehst du was ich meine?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Laden und leeren von Comboboxen Java Basics - Anfänger-Themen 8
F Scanner - nextLine() gibt leeren String zurück Java Basics - Anfänger-Themen 2
E Was ergibt trim() auf einen leeren String Java Basics - Anfänger-Themen 3
A Queue (Array) leeren Java Basics - Anfänger-Themen 1
S Erste Schritte Konsole leeren Java Basics - Anfänger-Themen 3
F Scanner + Stringbuilder geben leeren String aus wenn Umlaute enthalten sind Java Basics - Anfänger-Themen 29
S JFrame leeren Java Basics - Anfänger-Themen 6
B Ordner leeren/löschen Java Basics - Anfänger-Themen 5
S Input/Output einlesen aus einer evtl. leeren Datei Java Basics - Anfänger-Themen 5
T Konsole leeren? Java Basics - Anfänger-Themen 7
E Felder bei falscher Eingabe leeren Java Basics - Anfänger-Themen 8
A Datentypen Stringbuilder vollständig leeren Java Basics - Anfänger-Themen 6
Z GUI-Fenster leeren Java Basics - Anfänger-Themen 5
D Konsole leeren? Java Basics - Anfänger-Themen 5
S JTextField leeren ohne setText("")? Java Basics - Anfänger-Themen 3
L Problem damit, leeren String zurück zu geben Java Basics - Anfänger-Themen 16
M Kann kein Objekt (AudioFile in diesem Beispiel) für ein leeren String erzeugen Java Basics - Anfänger-Themen 3
J JTextfield mit Enter leeren Java Basics - Anfänger-Themen 3
Semox OOP ArrayList erlaubt keine Leeren Methode Java Basics - Anfänger-Themen 6
J Winzige Frage bezüglich leeren Zellen (HSSF) Java Basics - Anfänger-Themen 14
1 Icon Cache leeren Java Basics - Anfänger-Themen 10
M JTextField[] alle leeren Java Basics - Anfänger-Themen 4
M JTable sortieren ohne Berücksichtigung der leeren Zellen Java Basics - Anfänger-Themen 3
O Arbeit mit leeren Datensätzen / Objekten? Java Basics - Anfänger-Themen 5
J Tastatur-Puffer leeren Java Basics - Anfänger-Themen 3
C GUI Masken leeren Java Basics - Anfänger-Themen 13
G vector füllt sich immer weiter. wo muss ich ihn leeren? Java Basics - Anfänger-Themen 3
G Löschen durch Leeren Text einfügen? Java Basics - Anfänger-Themen 6
F Einer char-Variable "leeren" Inhalt zuweisen Java Basics - Anfänger-Themen 4
R GUI vollständig leeren Java Basics - Anfänger-Themen 10
G TXT leeren! Java Basics - Anfänger-Themen 6
S panel leeren Java Basics - Anfänger-Themen 2
G Beschreibung eines 'leeren' char-Wertes Java Basics - Anfänger-Themen 3
T Konsole leeren? Java Basics - Anfänger-Themen 5
J Textfeld beim anklicken leeren Java Basics - Anfänger-Themen 16
D Konsolenausgabe leeren Java Basics - Anfänger-Themen 16
EagleEye JTextArea leeren Java Basics - Anfänger-Themen 3
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
B Wie speicher ich die Outputs einer Methode in ein Array ein? Java Basics - Anfänger-Themen 1
L Frage zum Speicher bei Arrays Java Basics - Anfänger-Themen 7
L Herunterladbares Java Programm in bestimmten Ordner speicher Java Basics - Anfänger-Themen 3
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
F BufferedImage Speicher Nutzung Java Basics - Anfänger-Themen 2
TheSorm Problem mit Speicher Klasse Java Basics - Anfänger-Themen 3
S Wo speicher ich bilder und sounds ab? Java Basics - Anfänger-Themen 4
TheSorm Kleine Speicher Klasse Java Basics - Anfänger-Themen 24
C Variablen Speicher von Variablen erhöhen Java Basics - Anfänger-Themen 5
I Werte im Speicher auswerten ohne Umweg über eine Datei Java Basics - Anfänger-Themen 16
H Input/Output ImageIO.load frisst meinen ganzen Speicher weg! Java Basics - Anfänger-Themen 4
R Online-Speicher Java Basics - Anfänger-Themen 7
M Variablen speicher Java Basics - Anfänger-Themen 8
J FileOutputStream aktuelle Speicher Pfad ausgeben Java Basics - Anfänger-Themen 13
L Wieviel Speicher braucht ein Pixel? Java Basics - Anfänger-Themen 14
B Heap-Speicher wieder freigeben Java Basics - Anfänger-Themen 10
P Belegt "null" Speicher? Java Basics - Anfänger-Themen 25
T Erste Schritte Speicher läuft voll, Diashow, Images Java Basics - Anfänger-Themen 7
C Soundwiedergabe in einem Thread - Speicher besser bereinigen Java Basics - Anfänger-Themen 3
H warum speicher und läd mien editor nicht? Java Basics - Anfänger-Themen 24
T MysqlConnect und Speicher Java Basics - Anfänger-Themen 8
nabla Speicher voll, mit dem GC geht's daneben? Java Basics - Anfänger-Themen 7
hdi Programmier-Stil : Speicher vs. Quellcode Java Basics - Anfänger-Themen 67
G Button soll Speicher Dialog aufrufen Java Basics - Anfänger-Themen 10
N Probleme mit Input/OutputStreams, Daten im Speicher verwalte Java Basics - Anfänger-Themen 2
D nicht genug speicher - profiling trotz error Java Basics - Anfänger-Themen 5
A Problem mit nicht ausreichendem Speicher Java Basics - Anfänger-Themen 3
K speicher(String a, int b) Java Basics - Anfänger-Themen 14
N Zugriff auf Virtuelles Speicher Java Basics - Anfänger-Themen 18
J Belegter Speicher eines Ordners Java Basics - Anfänger-Themen 2
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
S Ringbuffer-Speicher mit einem Textfile Java Basics - Anfänger-Themen 2
A eingabe von jTextField lesen und speicher Java Basics - Anfänger-Themen 5
D Werte in Array speicher Java Basics - Anfänger-Themen 8
M Hilfe: Speicher freigeben? Java Basics - Anfänger-Themen 4
G Speicher als .txt -gibt ein Problem! Java Basics - Anfänger-Themen 6
A Speicher von VM ändern ohne Parameter Java Basics - Anfänger-Themen 3
S Speicher freigeben? Java Basics - Anfänger-Themen 5
T Größe eines Objektes im Speicher Java Basics - Anfänger-Themen 4
G Wieviel Speicher verbraucht ein Array? Java Basics - Anfänger-Themen 7
D Mit Java auf Speicher zugreifen Java Basics - Anfänger-Themen 3
L-ectron-X Speicher freigeben - Garbage Collection Java Basics - Anfänger-Themen 6
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
C Bilder von Festplatte in Programm hochladen Java Basics - Anfänger-Themen 6
R S.M.A.R.T. Werte einer Festplatte Java Basics - Anfänger-Themen 2
Q Findet existierendes File auf Festplatte nicht Java Basics - Anfänger-Themen 6
G Ordner aus Jar - File auf Festplatte kopieren? Java Basics - Anfänger-Themen 20
G zugriff auf festplatte / externe festplatten Java Basics - Anfänger-Themen 12
C Dateien aus JAR auf die Festplatte kopieren Java Basics - Anfänger-Themen 15
M Datei von FTP au Festplatte speichern Java Basics - Anfänger-Themen 3
5 Foto aus dem Netz auf Festplatte speichern Java Basics - Anfänger-Themen 2
D Html-Datei auf Festplatte öffnen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben