Passwort einlesen funktioniert nicht wie gewünscht

Status
Nicht offen für weitere Antworten.

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

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]
 

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.
 

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
 

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
L 4 stelliges Passwort aus bestimmten Zeichen. Java Basics - Anfänger-Themen 27
M Passwort erraten Java Basics - Anfänger-Themen 1
A Passwort erstellen Java Basics - Anfänger-Themen 3
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
JavaBeginner22 Passwort Generator Java Basics - Anfänger-Themen 2
S ArrayList Username und passwort mit JTextField eingaben abgleichen Java Basics - Anfänger-Themen 10
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
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
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
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 32
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

Ähnliche Java Themen

Neue Themen


Oben