Passwort einlesen funktioniert nicht wie gewünscht

Status
Nicht offen für weitere Antworten.
H

holgipopolgi

Mitglied
Hallo,

ich versuche gerade einen simplen Java-Texteditor zu schreiben, der Dateien Passwort-verschlüsselt speichern kann.
Leider kriege ich anscheinend die Applikation nicht dazu zu warten bis ich das Passwort eingegeben habe. Der Text wird anscheinend mit leerem Passwort verschlüsselt. Es sind bisher vier Klassen, ich füge den Code mal ein. Ich wäre sehr dankbar wenn mir jemand helfen würde oder auch nur einen Tipp geben würde.

Code:
/** 
 * Secure Text Editor main class.
 * Allows to confidentially open and save text files.
*/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class SecureTextEditor extends JFrame implements ActionListener {

    /** Setup open, save, and exist menu items (awt).*/
    private JMenuItem jmiOpen, jmiSave, jmiExit;

    /** Setup a text area (awt).*/
    private JTextArea jtaFile = new JTextArea();

    /** Setup a text field of length 12 (awt).*/
    private JTextField jtfFilename = new JTextField(12);

    /** Setup a windows title label (awt).*/
    private JLabel jlblStatus = new JLabel();

    /** Setup a file chooser dialog (awt).*/
    private JFileChooser jFileChooser = new JFileChooser();

    /** Create an Ecryptor object (custom).*/
    private Encryptor enc = new Encryptor();

    /** Create a PasswordReader object (custom).*/
    private PasswordReader pwd = new PasswordReader();

    /**
     * Secure Text Editor main method.
     * Call the constructor and set visual properties.
     */
    public static void main(String[] args) {
        SecureTextEditor frame = new SecureTextEditor();
        frame.setSize(1024, 768);
        frame.setVisible(true);
    }

    /**
     * Secure Text Editor constructor.
     * Build the window and its menu.
     */
    public SecureTextEditor() {

        /** Set the window title (awt).*/
        setTitle("SecureTextEditor");

        /** Setup a menu bar (awt).*/
        JMenuBar mb = new JMenuBar();
        setJMenuBar(mb);

        /** Setup a file menu (awt).*/
        JMenu fileMenu = new JMenu("File");
        mb.add(fileMenu);
        fileMenu.add(jmiOpen = new JMenuItem("Open"));
        fileMenu.add(jmiSave = new JMenuItem("Save"));
        fileMenu.add(jmiExit = new JMenuItem("Exit"));

        /** Add scroll bars (awt).*/
        getContentPane().add(new JScrollPane(jtaFile), BorderLayout.CENTER);
        getContentPane().add(jlblStatus, BorderLayout.SOUTH);

        /** Add action listeners for open, save, exit menu items (awt-event).*/
        jmiOpen.addActionListener(this);
        jmiSave.addActionListener(this);
        jmiExit.addActionListener(this);
    }

    /**
     * Decide which method is called according to given parameter.
     * @param e an action event.
     */
    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();

        if (e.getSource() instanceof JMenuItem) {
            if ("Open".equals(actionCommand)) {
                open();
            } else if ("Save".equals(actionCommand)) {
                save();
            } else if ("Exit".equals(actionCommand)) {
                System.exit(0);
            }
        }
    }

    /**
     * Open a file chosen by a user via file chooser.
     */
    private void open() {
        if (jFileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                open(jFileChooser.getSelectedFile());
            } catch (Exception ex) {
            }
        }
    }

    /**
     * Open, decrypt, and show a file according to given parameter.
     * @param file a file.
     */
    private void open(File file) throws Exception {
        try {
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            byte[] b = new byte[in.available()];
            in.read(b, 0, b.length);
            String s_dec = enc.decryptToString(b, pwd.readPassword());
            jtaFile.append(s_dec);
            in.close();
            jlblStatus.setText(file.getName() + " Opened");
        } catch (IOException ex) {
            jlblStatus.setText("Error opening " + file.getName());
        }
    }

    /**
     * Save a file to a file chosen by a user via file chooser.
     */
    private void save() {
        if (jFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
            try {
                save(jFileChooser.getSelectedFile());
            } catch (Exception ex) {
            }
        }
    }

    /**
     * Encrypt and save a file to a file according to given parameter.
     * @param file a file.
     */
    private void save(File file) throws Exception {
        try {
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
            byte[] b = (jtfFilename.getText()).getBytes();
            out.write(b, 0, b.length);
            out.write(enc.encrypt(jtaFile.getText(), pwd.readPassword()));
            out.close();
            jlblStatus.setText(file.getName() + " Saved ");
        } catch (IOException ex) {
            jlblStatus.setText("Error saving " + file.getName());
        }
    }
}

/** 
 * MyJPasswordField class.
 * Custom JPasswordField class.
*/
import java.awt.*;
import javax.swing.*;

public class MyJPasswordField extends JFrame {

    /** Setup a password field of length 10 (swing).*/
    private JPasswordField pwd = new JPasswordField(10);

    /**
     * Request a password from a user and store it in the attribute pwd.
     */
    public MyJPasswordField() {

        super("Please enter a password!");

	/** Setup a panel (swing).*/
        JPanel panel = new JPanel();

	/** Set background color (swing).*/
        panel.setBackground(Color.red);

	/** Set char to be shown when typing (swing).*/
        pwd.setEchoChar('#');

	/** Add password field to the panel (swing).*/
        panel.add(pwd);

	/** Show panel (swing).*/
        getContentPane().add(panel);
    }

    /**
     * Return the password stored in the attribute pwd.
     * @return password an array of char.
     */
    public char[] getPassword() {

        return pwd.getPassword();
    }
}

/** 
 * PasswordReader class.
 * Allows to request a password from a user.
*/
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.swing.*;

public class PasswordReader {

    /**
     * Decide which method is called according to given parameter.
     * @return pbeKey a secret (symmetric) key.
     */
    public SecretKey readPassword() throws Exception {

    	/** Setup and show a password field (custom).*/
        MyJPasswordField mpf = new MyJPasswordField();
        mpf.setSize(150, 100);
        mpf.setVisible(true);
        mpf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    	/** Create a user-chosen password that can be used with password-based encryption (javax-crypto-spec).*/
        PBEKeySpec pbeKeySpec = new PBEKeySpec(mpf.getPassword());

    	/** 
	 * Setup a key factory to convert a key specification into an opaque cryptographic key (javax-crypto).
	 * Use MD5 and DES algorithms.
	 */
        SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");

    	/** Create an opaque cryptographic key (javax-crypto).*/
        SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

        return pbeKey;
    }
}

/** 
 * Encryptor class.
 * Password-based encryption and decryption.
*/
import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.util.*;

public class Encryptor {

    /**
     * Salt according to the PKCS #5 standard.
     * The PBE process requires an arbitrary salt value that is combined with the user-supplied password.
     * This reduces the possibility of an attacker generating a list of all possible digested passwords.
     * The salt increases the number of password digests that the attacker has to pre-compute.
     * A real application would NOT use a static salt.
     */
    private byte[] salt = {
    	(byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
        (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99
    };

    /** Iteration count.*/
    private int count = 20;

    /**
     * Encrypt a plaintext.
     * @param plaintext a plaintext.
     * @param encryptionKey a password.
     * @return a ciphertext.
     */
    public byte[] encrypt(String plaintext, SecretKey encryptionKey) throws Exception {

    	/** Construct a parameter set for password-based encryption as defined in the PKCS #5 standard (crypto-spec).*/
        PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);

    	/** Provide the functionality of a cryptographic cipher for encryption and decryption.*/
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");

    	/** Change to encrypt mode; set encryption key and parameter set.*/
        pbeCipher.init(Cipher.ENCRYPT_MODE, encryptionKey, pbeParamSpec);

    	/** Encrypt and return ciphertext.*/
        return pbeCipher.doFinal(plaintext.getBytes());
    }

    /**
     * Decrypt a ciphertext.
     * @param ciphertext a ciphertext.
     * @param encryptionKey a password.
     * @return a plaintext.
     */
    public String decryptToString(byte[] ciphertext, SecretKey encryptionKey) throws Exception {

	/** Construct a parameter set for password-based encryption as defined in the PKCS #5 standard (crypto-spec).*/
        PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);

    	/** Provide the functionality of a cryptographic cipher for encryption and decryption.*/
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");

    	/** Change to decrypt mode; set encryption key and parameter set.*/
        pbeCipher.init(Cipher.DECRYPT_MODE, encryptionKey, pbeParamSpec);

    	/** Decrypt and return plaintext.*/
        return new String(pbeCipher.doFinal(ciphertext));
    }
}
 
S

SegmoDaVinci

Mitglied
Grüße dich,
du erzeugst ein JFrame mit einem JPasswordField ohne auf die entsprechende Eingabe ins JPasswordField zu warten. readPassword() bekommt somit gar nichts von einer Eingabe mit. Versuchs mal hiermit:
Code:
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

public class MyJPasswordField{

    /** Setup a password field of length 10 (swing).*/
    private JPasswordField pwd = new JPasswordField(10);
   
    /**
     * Request a password from a user and store it in the attribute pwd.
     */
    public MyJPasswordField() {
   /** Set char to be shown when typing (swing).*/
        pwd.setEchoChar('#');       

        JOptionPane.showMessageDialog(
              null,
                pwd,
                "Please enter a password!",
                JOptionPane.PLAIN_MESSAGE);
    }
    /**
     * Return the password stored in the attribute pwd.
     * @return password string.
     */
    public String getPassword(){
       return String.valueOf(pwd.getPassword());
    }
}
/**
* PasswordReader class.
* Allows to request a password from a user.
*/
import javax.crypto.*;
import javax.crypto.spec.*;
public class PasswordReader {

    /**
     * Decide which method is called according to given parameter.
     * @return pbeKey a secret (symmetric) key.
     */
    public SecretKey readPassword() throws Exception {

       /** Setup and show a password field (custom).*/
        MyJPasswordField mpf = new MyJPasswordField();

       /** Create a user-chosen password that can be used with password-based encryption (javax-crypto-spec).*/
        PBEKeySpec pbeKeySpec = new PBEKeySpec(mpf.getPassword().toCharArray());

       /**
    * Setup a key factory to convert a key specification into an opaque cryptographic key (javax-crypto).
    * Use MD5 and DES algorithms.
    */
        SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");

       /** Create an opaque cryptographic key (javax-crypto).*/
        SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

        return pbeKey;
    }
}
[/code]
 
H

holgipopolgi

Mitglied
Hallo,

ja, genau das habe ich gesucht! Vielen Dank für die schnelle Hilfe!

Grüße,
Holger
 
H

HoaX

Top Contributor
außerdem ist eine open-methode nicht wirklich gut:
Code:
byte[] b = new byte[in.available()];
in.read(b, 0, b.length);

available gibt dir in dem fall nicht zwangsläufig die dateigröße zurück, d.h. du liest nicht immer die ganze datei. außerdem ist das nicht immer performant die ganze datei komplett im speicher zu halten.

definiere dir lieber einen festen puffer mit 16k und lies mit diesem mittels einer schleife.
 
H

holgipopolgi

Mitglied
Hallo,

ja, nachdem ich nochmal in die API geguckt habe stimmt das wohl. Wie mache ich das denn mit dem 16k Block? Hast du evtl. ein Beispiel-Code-Schnipsel für mich?

Grüße,
Holger
 
H

HoaX

Top Contributor
Code:
byte[] bytes = new byte[16000];
int length;
while((length = in.read(bytes))!=-1) {
    out.write(bytes, 0, length);
}

so ungefähr
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Passwort abprüfen Java Basics - Anfänger-Themen 5
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
cpt.Tomato Scanner problem mit Passwort Login Java Basics - Anfänger-Themen 3
B Email versand - aber akzeptiert auch falscher Username und Passwort??? Java Basics - Anfänger-Themen 1
N Passwort Anfrage vor Programm start Java Basics - Anfänger-Themen 1
K Methoden Passwort Bestätigungsfeld mit Password vergleichen Java Basics - Anfänger-Themen 7
A Passwort System Java Basics - Anfänger-Themen 4
G Passwort und Passwort wiederholen in if-Abfrage vergleichen Java Basics - Anfänger-Themen 15
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
J Passwort überprüfen Java Basics - Anfänger-Themen 3
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
C Encrypted (passwort) Rar Datei entpacken Java Basics - Anfänger-Themen 42
Detox Passwort verschleiern Java Basics - Anfänger-Themen 4
A Erste Schritte Passwort an "Internetseite" übergeben. Java Basics - Anfänger-Themen 2
B Passwort zurücksetzen Java Basics - Anfänger-Themen 1
U Passwort verschlüsseln schlägt fehl Java Basics - Anfänger-Themen 3
T Passwort Generator Java Basics - Anfänger-Themen 2
B If Abfrage mit Passwort und Username Java Basics - Anfänger-Themen 2
fLooojava Passwort generieren - kleines Programm Java Basics - Anfänger-Themen 15
Z User/passwort eingabe...Help! Java Basics - Anfänger-Themen 4
M Passwort-Generator Java Basics - Anfänger-Themen 3
S Passwort Manager Java Basics - Anfänger-Themen 2
J Passwort Java Basics - Anfänger-Themen 4
A Passwort Schutz Java Basics - Anfänger-Themen 8
U Passwort auf JButton setzen. Java Basics - Anfänger-Themen 2
P Passwort Abfrage Java Basics - Anfänger-Themen 3
F Login Passwort-Vergleich Java Basics - Anfänger-Themen 12
c_sidi90 Passwort Generator Code Erweiterung Java Basics - Anfänger-Themen 12
K Methode Passwort generieren Java Basics - Anfänger-Themen 10
F OOP Textdatei zippen und mit Passwort sichern Java Basics - Anfänger-Themen 5
Benji0815 Java Passwort in Formular eingeben Java Basics - Anfänger-Themen 5
G Passwort verschluesselt speichern Java Basics - Anfänger-Themen 7
M Regular Expression - Passwort - aufeinanderfolgende Zeichen Java Basics - Anfänger-Themen 3
S Erster Versuch: Passwort erstellen Java Basics - Anfänger-Themen 3
S String Vergleich mit Passwort geht nur bei Zahlen ? Java Basics - Anfänger-Themen 7
S Vergleichen von verschlüsselten Passwort Java Basics - Anfänger-Themen 3
G Passwort vor unbefugtem Zugriff schützen Java Basics - Anfänger-Themen 7
D Passwort verschlüsseln mit MD5 Java Basics - Anfänger-Themen 30
P Passwort überprüfen mit regular Expression Java Basics - Anfänger-Themen 4
O Unsichtbares Passwort Java Basics - Anfänger-Themen 2
R Passwort Maskierung in der Konsole Java Basics - Anfänger-Themen 9
I Frame mit Passwort-Eingabe (Datenbank) Java Basics - Anfänger-Themen 6
V Passwort-String byteweise in eine Datei schreiben Java Basics - Anfänger-Themen 6
T Passwort nicht in URL übergeben Java Basics - Anfänger-Themen 5
B Benutzername und Passwort an Internetseite übergeben Java Basics - Anfänger-Themen 3
B Passwort generator Java Basics - Anfänger-Themen 7
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 21
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
UnknownInnocent Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Anzeige

Neue Themen


Oben