# Passwort generieren - kleines Programm



## fLooojava (7. Dez 2013)

Hi,

ich bin seit kurzer Zeit hier im Forum angemeldet und bisher war ich nur immer fleißig am mitlesen. Ich befinde mich gerade in der Lernphase von Java und bediene mich hiermit mit einem Buch über Java.

Ich habe heute aufgrund von Eigeninteresse ein kleines Programm, welches ein Passwortgenerator sein soll, entwickelt. ( ist ganz klein, aber dennoch lerne ich etwas =) )

_Ich habe insgesamt 3 Klassen. In einer ist die Main-Methode die dann die Sache zum ausführen bringt. In der passwordLength Klasse kann per input eingegeben werden wieviel Zeichen das Passwort haben soll und in der codeGenerator  Klasse befindet sich die Methode in der der zufällige Code erstellt wird. _
Code:

```
public class getCode
{


	/**
	 * @param args
	 * @param nt 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		codeGenerator cG = new codeGenerator();

		cG.generateRC();
	}

}
```


```
import java.util.Scanner;


public class passwordLength
{

	public int getpwLength(){
		Scanner scanner = new Scanner(System.in);
		System.out.println("lenght of the new pw: ");
		String input = 	scanner.nextLine();
		int lengthint= Integer.parseInt(input);
		scanner.close();
		return lengthint;
	}

}
```


```
import java.util.Random;
import java.util.Scanner;

public class codeGenerator
{

	public void generateRC(){
	int i = 1;
	passwordLength pwlength = new passwordLength();
	int length = pwlength.getpwLength();
	char[] chars = "abcdefghijklmnopqrstuvwxyz2131994".toCharArray();
	StringBuilder stringbuilder = new StringBuilder();
	Random random = new Random();
	while(i<=length){
	    char c = chars[random.nextInt(chars.length)];
	    stringbuilder.append(c);
		i = i+1;
	}

	String code = stringbuilder.toString();
	System.out.println("new password: " +"'" +code + "'");
}
}
```

*Meine Frage nun: Gibt es hier Verbesserungsmöglichkeiten, oder hättet ihr es auch so programmiert?* :idea:

Danke für eure Hilfe - Ich freue mich über jeden Verbesserungsvorschlag von euch! 

flo


----------



## MR_UNIX (7. Dez 2013)

Kann man in meinen Augen nicht viel daran aussetzen außer, dass eine eigene Klasse für die Länge des Passworts sinnlos ist, es reicht ein Attribut in der Generator Klasse.
Weiterhin solltest du im Hinblick auf deine Namensgebung für die Klassen mal einen Blick auf die Java Code Conventions werfen!

Hoffe, ich konnte helfen


----------



## fLooojava (7. Dez 2013)

Hallo MR_Unix,

danke dir für deine Meldung.
_
Ja da hast du recht, da könnte ich die passwordLength Klasse weglassen, die ist eher sinnlos so wie es jetzt ist. Die Namensgebung ist mir leider untergegangen, danke für den Hinweis! Natürlich sollten die Klassen immer mit einem Großbuchstaben anfangen. _

*
Ich hab's kurz geändert - So sollte es in Ordnung sein oder?*


```
import java.util.Scanner;


public class CodeGenerator
{


	/**
	 * @param args
	 * @param nt 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		System.out.println("lenght of the new pw: ");
		String input = 	scanner.nextLine();
		int length= Integer.parseInt(input);
		scanner.close();
		
		CreatePassword createpw= new CreatePassword();
		createpw.generateRC(length);
	}

}
```



```
import java.util.Random;


public class CreatePassword
{

	public void generateRC(int length){
	int i = 1;
	//passwordLength pwlength = new passwordLength();
	//int length = pwlength.getpwLength();
	char[] chars = "abcdefghijklmnopqrstuvwxyz2131994".toCharArray();
	StringBuilder stringbuilder = new StringBuilder();
	Random random = new Random();
	while(i<=length){
	    char c = chars[random.nextInt(chars.length)];
	    stringbuilder.append(c);
		i = i+1;
	}

	String code = stringbuilder.toString();
	System.out.println("new password: " +"'" +code + "'");
}
}
```

Danke dir MR_UNIX .

flo


----------



## MR_UNIX (7. Dez 2013)

Gefällt mir schon viel besser. Spontan fällt mir kein Verbesserungsvorschlag ein. Du könntest allerdings in dein Array der verfügbaren Zeichen vielleicht noch ein paar Sonderzeichen aufnehmen, um noch bessere Passwörter zu erzeugen. Falls ich ihn finde, kann ich dir auch mal per PN falls du Interesse hast den Code meines Passwort-Generators (mit GUI) zusenden, den ich vor einer gefühlten Ewigkeit mal gebastelt habe!

MFG


----------



## fLooojava (7. Dez 2013)

Ja, da kommen noch Sonderzeichen dazu.  

Danke nochmals!

_PS: Ich hab dir dazu mal ne PM geschickt. _


----------



## fLooojava (6. Feb 2014)

Hi,

ich habe im neuen Jahr mal ein wenig weiterprogrammiert und es ist auch deutlich was an Code dazugekommen. Ich habe das komplette Projekt nun in eine GUI verpackt und diverse Funktionen eingebaut. Natürlich ist es noch nicht ganz vollendet, aber es gibt immer wieder Erweiterungen.

Es würde mich sehr freuen, wenn ich verschiedene Meinungen bezüglich meinem Code bekomme um so aus Fehlern zu lernen. Wird alles so programmiert, wie ich es programmiert habe? Gibt es Verbesserungsmöglichkeiten? Gibt es eine Stelle im Code die auf garkeinen Fall so gemacht wird?




Spoiler: CodeGenerator





```
public class CodeGenerator
{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GUIGen guigen= new GUIGen();
	}

}
```






Spoiler: CreatePassword





```
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Random;


public class CreatePassword
{


	
	
	public String generateRandomCode(int length){
	int i = 1;

	char[] chars = "abcdefghijklmnopqrstuvwxyz2131994".toCharArray();
	StringBuilder stringbuilder = new StringBuilder();
	Random random = new Random();

	while(i<=length){
	    char c = chars[random.nextInt(chars.length)];
	    stringbuilder.append(c);
		i = i+1;
	}
	
	
	
	String code = stringbuilder.toString();       
	return code;

}


}
```






Spoiler: GUIGen





```
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class GUIGen extends JFrame 
{
	private JTextArea textarea = new JTextArea(5,25);
	//private JLabel jlblStatus = new JLabel();
	private int length;
	public GUIGen ()
	   {
		   JFrame frame = new JFrame("password generator");
	       frame.setSize(600,200);
	      
	       frame.setLocation(300,300);
	       frame.setResizable(false);
	       FlowLayout flowlayout = new FlowLayout();
	       frame.setLayout(flowlayout);
	       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	       JPanel panel = new JPanel();
	       JLabel lblpw = new JLabel("length of your password : ");
	       JLabel lblcountpw = new JLabel ("passwords to create : ");
	       JPanel panel1 = new JPanel();

           
	        final JTextField tfieldlength = new JTextField();
	        tfieldlength.setColumns(2);
	        JTextField tfieldcount = new JTextField();
	        tfieldcount.setColumns(2);
	       // private JTextArea textarea = new JTextArea(5,25);
	        JScrollPane sp = new JScrollPane(textarea);
	        textarea.setBackground(Color.LIGHT_GRAY);
	        textarea.setEditable(false);
	        
	        textarea.setLineWrap(true);
	        textarea.setWrapStyleWord(true);
	        
	        final JTextArea textareaedit = new JTextArea(5,25);
	        JScrollPane spe = new JScrollPane(textareaedit);

	        textareaedit.setEditable(true);
	        textarea.setLineWrap(true);
	        textarea.setWrapStyleWord(true);
	        

	       final JButton btngenpw = new JButton("generate pw");
	       
	       // ComboBox
	       String comboBoxlist[] = {"1","2","3",
	    		   					"4","5","6",
	    		   					"7","8","9",
	       							"10"};
	       final JComboBox dropdownlist = new JComboBox(comboBoxlist);
	       
	      
	       
	       // menubar

	       	JMenuBar menubar = new JMenuBar();
	       	menubar.setBackground(Color.getHSBColor(60,60, 60));
	        JMenu file = new JMenu ("File");
	        
	        JMenu help = new JMenu ("Help");
	        menubar.add(file);
	        menubar.add(help);
	        
	        JMenuItem save = new JMenuItem("Save");
	        save.setBackground(Color.getHSBColor(60,60, 60));
	        JMenuItem print = new JMenuItem("Print");
	        print.setBackground(Color.getHSBColor(60,60, 60));
	        JMenuItem quit = new JMenuItem("Quit");
	        quit.setBackground(Color.getHSBColor(60,60, 60));
	        JMenuItem about = new JMenuItem("About");
	        about.setBackground(Color.getHSBColor(60,60, 60));
	        
	        file.add(save);
	        file.add(print);
	        file.add(quit);
	        help.add(about);
	        
	        frame.setJMenuBar(menubar);
	       //
	       
	       panel.add(lblcountpw);
	       panel.add(dropdownlist);
	       panel.add(lblpw);
	       panel.add(tfieldlength);
	       
	       panel.add(btngenpw);

	       
	       frame.add(panel);
	       frame.add(panel1);

	       frame.add(sp);
	       frame.add(spe);
	     //  frame.add(jlblStatus);
	  
	       frame.setVisible(true);
	       
	       quit.addActionListener ( new ActionListener(){
	    	  public void actionPerformed(ActionEvent e){
	    		  System.exit(0);
	    	  }
	    	   
	       });
	       
	       save.addActionListener(new ActionListener(){
	    	   
	       
	    	   public void actionPerformed(ActionEvent e){
	    		   save();
	    	   
	       }
	       });
	       about.addActionListener ( new ActionListener(){
	    	   public void actionPerformed(ActionEvent e){
	    		   JFrame frame = new JFrame("About");
	    		  
	    		   JOptionPane aboutmsg = new JOptionPane();
	    		   aboutmsg.showMessageDialog(frame,"V0.1 \n It's possibly to create a random password. \n +implemented a menubar \n \n proposed updates:\n" +
	    		   		"-add some variable informations next to the password (for different accounts)\n" +
	    		   		"-more than one password with one click\n" +
	    		   		"-implement a save function\n" +
	    		   		"-implement a print function");	    
	    		  
	    	   }
	       });
	       

	       btngenpw.addActionListener (new ActionListener() {
  				@Override
  				public void actionPerformed(ActionEvent e) {
  					// TODO Auto-generated method stub
  					// System.out.println(e);
  					//System.out.println(dropdownlist.getSelectedIndex());
  					
  					int count = dropdownlist.getSelectedIndex()+1;
  		            String input = tfieldlength.getText();
  		 	        int length = Integer.parseInt(input);
  		 	      
  		 	       CreatePassword createpw= new CreatePassword();
  		 	       int i=1;
  		 	       
  		 	       textarea.setText("");
  		 	       textareaedit.setText("");
  		 	       do{
  		 	       textareaedit.append("password "+i+" is for: \n");
  		 	       textareaedit.setCaretPosition(0);
  		 		   textarea.append("Your new password:\n"+createpw.generateRandomCode(length)+"\n"+"----------------------------------\n"+"Created from: "+ System.getProperty("user.name")+"\n"+"Operating System: "+ System.getProperty("os.name")+"\n\n");
  		 		   textarea.setCaretPosition(0);
  		 		   i++;
  		 	       //System.out.println("laufende variable"+i);
  		 	       //System.out.println("dropdown ausgewählt: " +count);
  		 	       }while(i<=count);
  		 		
  		 	       }
  			
  			
  		 });
	       
	   }
	  private JFileChooser jFileChooser = new JFileChooser();
	  private void save(){
	    if (jFileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION){
	      save(jFileChooser.getSelectedFile());
	    }
	  }
	 
	  private void save(File file){
	    try{
	      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
	      byte []  b = (textarea.getText()).getBytes();
	      
	      out.write(b, 0, b.length);
	      out.close();
	 
	      //jlblStatus.setText(file.getName() + " saved ");
	    }
	 
	    catch (IOException ex){
	      //jlblStatus.setText("Error saving " + file.getName());
	    }
	       
	       
	  }
	      
	    
	  
	}
```






Spoiler: Ausführung












Wäre sehr cool! 

Schöne Grüße!


----------



## JavaMeetsBlueJ (7. Feb 2014)

Ich hab gerade deinen Code mal durchgelesen und noch einen kleinen Verbesserungsvorschlag, es sei denn ihch hab den String der Zeile nicht richtig verstanden 

Ist es nicht sinnvoller, das Chararray wie folgt zu füllen?


```
char[] chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz000111222333444555666777888999".toCharArray();
```

Liebe Grüße


----------



## fLooojava (9. Feb 2014)

Sinvoller wäre es aufjedenfall, das ändere ich dann auch noch. Aber prinzipiell vom Code - passt alles? Oder gibt's irgendwo Sachen wo anderst programmiert werden?

lg


----------



## fLooojava (11. Feb 2014)

Ich würde mich über jede konstruktive Kritik sehr freuen!


----------



## JavaMeetsBlueJ (13. Feb 2014)

Hast du schon die Speicherfunktion implementiert? ;-)


----------



## fLooojava (13. Feb 2014)

Ich habe bereits eine Speicherfunktion, die speichert bei jeder Ausführung. Ist jedoch nicht dass, was ich dann wirklich möchte.

Wegen?


----------



## JavaMeetsBlueJ (13. Feb 2014)

Du könntest dir mal anschauen was MVC ist, wenn du dich schon mit Guis beschäftigst ;-)


----------



## fLooojava (14. Feb 2014)

hmm MVC sagt mir garnicht's... Ist MVC bei den ersten Schritten relevant? :bahnhof:


----------



## JavaMeister (15. Feb 2014)

Was sagt google dazu?


----------



## fLooojava (15. Feb 2014)

Naja, es ist quasi ein Entwurfsmuster, um anschließend das Projekt zu vergrößern, beliebige Komponente zu verändern. Sprich dass fehlt bei mir komplett? Bei mir ist eher alles "durcheinanender"?


----------



## JavaMeetsBlueJ (15. Feb 2014)

Guck dir an, was Interfaces sind und was für Möglichkeiten damit hat. Wenn du das verstanden hast, versuch das Entwurfsmuster erstmal ohne Gui anzuwenden. Wenn das dann sitzt kannst du dich mal nach dem Interface Observer und der Klasse Observable erkundigen, wobei hier die Meinungen auch auseinandergehen ;-)

[TIPP]Das dauert eigentlich nicht allzu lange, das System nachzuvollziehen  poste doch einfach mal deinen Passwortgenerator mit MVC Pattern. Das ist eigentlich ein perfektes Beispiel, weil sich der Code bei dem Programm ja echt in Grenzen hält. Viel Erfolg dabei ;-)[/TIPP]


----------

