Eigene Klasse verschlüsselt in Datei speichern

maximilian1

Mitglied
Hallo, ich habe eine eigene Klasse geschrieben die String,double,int,ArrayList und so weiter einhält. Diese speichere ich zur Zeit unverschlüsselt in eine Datei ab. Gibt es die möglichkeit einen verschlüsselten ObjectOutput bzw ObjectInputStream zum speichern zu verwenden. gibt es da schon fertige Lösungen?
 
okay danke ich nehmen mir jetzt mal:
Symmetrische Verschlsselung
vor.

Beschreibt dieser Code eine eigene Klasse und ist er komplett?

Java:
 protected final Cipher initCipher(boolean encryptMode)
           throws IOException, GeneralSecurityException {
    // Passwort-Hash berechnen und Schlüssel aufbereiten
    byte[] rawKey = initSymmetricKey(encryptMode);
    // Initialisierung des TripleDES-Schlüssels
    Key key;
    key = new SecretKeySpec(
            new DESedeKeySpec(rawKey).getKey(), ENC_ALG);

    // Initialisierung des Cipher-Objekts
    Cipher cipher;
    cipher = Cipher.getInstance(ENC_ALG);
    if (encryptMode)
      cipher.init(Cipher.ENCRYPT_MODE, key);
    else
      cipher.init(Cipher.DECRYPT_MODE, key);
    return cipher;
  }
 
Wie kann ich ihm hier sagen, welches Objekt er verschlüsseln soll?

Java:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class WriteDES
{
  public static void main( String args[] ) throws Exception
  {
    Cipher c = Cipher.getInstance( "DES" );

    Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );
    c.init( Cipher.ENCRYPT_MODE, k );

    OutputStream out = new FileOutputStream( "C:/t.des" );
    CipherOutputStream cos = new CipherOutputStream( out, c );

    cos.write( "Das wird anders werden".getBytes() );

    cos.close();
  }
}
 
Sehe gerade.

In der 5. Auflage der Insel gab es ein Beispielprogramm zum Ver4schlüsseln:
Java ist auch eine Insel – 25.5 Verschlüsseln von Daten(-strömen)

In der 8. Auflage gab es ein Beispielprogramm zum Ver- und Entschlüsseln:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 26.6 Verschlüsseln von Daten(-strömen)

In der 9. Auflage wurde das Thema komplett gestrichen:
Galileo Computing :: Java ist auch eine Insel –

Einer der Bücher, bei denen man mehrere Auflagen parallel braucht. Da gilt nicht, daß in der letzten Auflage alles der vorigen Auflagen und noch mehr drin ist.
 
Danke, ich habs jetzt soweit hinbekommen, das ich speicher und lese, aber ich bekomme eine Fehlermeldung:

java.io.StreamCorruptedException: invalid stream header: 18ED4F6D
at java.i😵bjectInputStream.readStreamHeader(Unknown Source)
at java.i😵bjectInputStream.<init>(Unknown Source)
at core.Gui.loadDatabaseCrypted(Gui.java:1093)
at core.Gui.<init>(Gui.java:195)
at core.Gui$1.run(Gui.java:217)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Hier ist der Code:
schreiben:
Java:
public void saveDatabaseCryped( String path ) throws Exception {
	
	Cipher c = Cipher.getInstance( "DES" );
    Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );
    c.init( Cipher.ENCRYPT_MODE, k );
    OutputStream out = new FileOutputStream( path );
    CipherOutputStream cos = new CipherOutputStream( out, c );
    ObjectOutputStream oos = new ObjectOutputStream(cos);
    oos.writeObject( mainUserAccount );
    cos.close();
    oos.close();
}

lesen:
Java:
public void loadDatabaseCrypted() throws Exception{
	Cipher c = Cipher.getInstance( "DES" );
    Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );
    c.init( Cipher.ENCRYPT_MODE, k );
    InputStream in = new FileInputStream( "databasework" );
    CipherInputStream cis = new CipherInputStream( in, c );
    ObjectInputStream ois = new ObjectInputStream(cis);
    mainUserAccount = (Benutzerkonto) ois.readObject();
    cis.close();
    ois.close();
}

was ist da falsch?
 
Hmmm.. Scheint irgendetwas mit dem ObjectInputStream oder so zu tun zu haben.
Also wenn man ObjectInputSteream auskommentiert funktioniert es.

Hier noch mal Dein Code in einem kompletten Programm:

Code:
import java.io.*; 
import java.security.Key; 
import javax.crypto.*; 
import javax.crypto.spec.SecretKeySpec; 
import sun.misc.*; 

public class Z {
  String mainUserAccount = "dw";

  public void saveDatabaseCryped( String path ) {
    
    try {
    Cipher c = Cipher.getInstance( "DES" );
    Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );
    c.init( Cipher.ENCRYPT_MODE, k );
    OutputStream out = new FileOutputStream( path );
    CipherOutputStream cos = new CipherOutputStream( out, c );
    ObjectOutputStream oos = new ObjectOutputStream(cos);
    oos.writeObject( mainUserAccount );
    oos.close();
    cos.close();
    out.close();
    } catch (Exception e) {
      System.out.println("+"+e);
    }
  }


  public void loadDatabaseCrypted() {
    try {
    Cipher c = Cipher.getInstance( "DES" );
    Key k = new SecretKeySpec( "01234567".getBytes(), "DES" );
    c.init( Cipher.ENCRYPT_MODE, k );
    InputStream in = new FileInputStream( "databasework" );
    CipherInputStream cis = new CipherInputStream( in, c );
    ObjectInputStream ois = new ObjectInputStream(cis);
////    mainUserAccount = (Benutzerkonto) ois.readObject();
    mainUserAccount = (String) ois.readObject();
    ois.close();
    cis.close();
    in.close();
    } catch (Exception e) {
      System.out.println("*"+e);
    }
  }

  public Z() {
    saveDatabaseCryped("databasework");
    loadDatabaseCrypted();

  }

  public static void main(String[] args) {
     Z j = new Z();
  }

}

Die Fehlermeldung kommt bei mir auch.


Btw: in.close() und out.close() fehlen in Deinem Programm.
Aber mit denen funzt es auch nicht.
 

Zurück
Oben