Passwort Generator Code Erweiterung

c_sidi90

Top Contributor
Nachdem ich gestern einige an Tipps von euch bekommen habe, habe ich mein Code umgeschrieben, der ist auch soweit in Ordnung. Nur jetzt liege ich vor dem Problem das ich verschiedene Kriterien für die Erfüllung des gewünschten Passwortes einbinden möchte.

z.B. soll geprüft werden ob das gewünschte Passwort auch die richtige Länge, Anzahl an Buchstaben usw. hat.

Dafür hab ich eine Boolische Variable erstellt. Mir fehlt jedoch der Ansatz für die implementierung der verschiedenen Abfragen.

Hier mein Code

Java:
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Generator {
	//Richtigkeitskriterien für die Erstellung des Passwortes
	static Boolean gueltig(String tPW){
		if (tPW==""){
			return false;
		} else {
			return true;
		}
		
	}
	//Methode die ein Char zurückliegert
	static char getASCIIZeichen(){
		int Zahl = 0;
        //Zufallsbuchstaben generieren
        while ((Zahl < 48) || 
                 (Zahl > 122) || 
                 ((Zahl >= 91) && (Zahl <= 96)) || 
                 ((Zahl >= 58) && (Zahl <= 64))) {
      	  Zahl = ((int)(Math.random() * 1000)) + 32;
        }
        return (char)Zahl;
	}
        
	public static void main (String[]args)throws IOException{
		//Benutzereingabe erzeugen
		InputStreamReader Wandler = new InputStreamReader(System.in);
		BufferedReader Eingabe = new BufferedReader (Wandler);
		String buchstabenString = "";
		String PW = "";
		//Variablen Deklaration  für die Benutzereingaben
		String laengeString="";
		int laenge=0;
		int buchstaben=0;
		//Deklaration der Variablen für die Buchstabengenerierung
        
          
          System.out.println ("Bitte geben Sie die gewünschte Passwortlaenge ein...");
          laengeString = Eingabe.readLine();
          
          System.out.println ("Bitte geben Sie die gewünschte Anzahl an Buchstaben ein");
          buchstabenString = Eingabe.readLine();
          
          
          laenge = Integer.parseInt(laengeString);
          buchstaben = Integer.parseInt(buchstabenString);
          //Beginn While-Schleife für die Rückgabe von Char
          while (gueltig(PW) == false){
        	  PW = "";
        	  //Solange PW < Benutzereingabe gewünschte laenge getASCIIZeichen();
              for (int i=1; i<=laenge; i++){
            	  PW = PW + getASCIIZeichen();
              }
        	  
          }
          System.out.println(PW);
        	  
		}
		
	}
 
P.S die Schleife [Java] while ((Zahl < 48) ||
(Zahl > 122) ||
((Zahl >= 91) && (Zahl <= 96)) ||
((Zahl >= 58) && (Zahl <= 64))) {
Zahl = ((int)(Math.random() * 1000)) + 32;
[/Java]
hat den Zweck das ich mir den ASCII Code angesehn habe und bemerkt habe das die ersten 32 Buchstaben nur Sonderzeichen sind, die ich im Passwort nicht ausgeworfen haben möchte, daher das +32. Die *1000 sind dafür gewählt, da es ja z.B für "a" auch das "A" gibt, darum hab ich die Zeichen verdoppelt.
 
Hallo,

wie ich bereits in mehreren Postings geschrieben habe auch hier:

Man wählt zufällige Zahlen aus einem Pool von möglichen Zahlen und nicht per zufall.

Das bedeutet:

Du machst dir eine Liste (in der Informatik via Array oder ArrayList):

A,B,C,a,b,c,1,2,3

Dann hast du ein Math.random() * array.lenght; Und tadaa es kommen nur die gwünschten Zeichen bei raus.

Durch Segmentbildung e.g. [0..2] = Großbuchstaben; ...

Kann man direkt zählen, wieviele Buchstaben, Zahlen in dem PW vorkommen.

Und was soll

(int)(Math.random() * 1000) => "ich habe die Zahlen verdoppelt?" bedeuten.

Das erzeugt eine Zufallszahl zwischen 0 und 1000 und wenn man da in die ascii tabelle schaut...:rtfm:

Gruß,

Martin
 
Zuletzt bearbeitet von einem Moderator:
Der Code Funktioniert ja, nur ich möchte jetzt anhand von IF-Anweisungen in der Variable Boolean gueltig(String tPW) die Kriterien für das Nichterfüllen des gewünschten Passwortes Abfragen und den Code nicht mit Arrays ausstatten was bei dieser Aufgabe unnötig ist.

Math.random()*1000 dient dafür, das ja jede Zufalls Zahl im ASCII ein Zeichen darstellt, würde ich die Zufallszahlen allerdings nur bis z.B. 500 wählen, sind nicht alle Zeichen dargestellt. Das meinte ich damit.

Nun bitte Hilfe zu meinem eigentlichen Problem und keine Vorschläge für die Code umschreibung da dieser so ja Funktioniuert und ich ihn gerne so beibehalten möchte.

Danke
 
Die Lösung zu deinem Problem habe ich ebenfalls skizziert.

Du musst bei jeder generierten Zahl checken zu welcher Klasse sie gehört.

if(zahl ist Buchstabe)
anzahlBuchstaben++


Das Alphabet geht bis 90 in der Ascii Tabelle alles dad rüber sind sonderzeichen und alles über 256 sind Erweiterte Asciizeichen, die in Deutschland nicht ohne weiteres auf der Tastatur einzugeben sind ^^
 
Kannst du mir das als Beispiel einmal oben in meinen Code einbetten, ich hab dort echt einen Hänger, also an der Stelle sollen die Abfragen ja geschrieben werden
Java:
    static Boolean gueltig(String tPW){
        if (tPW==""){
            return false;
        } else {
            return true;
        }
        
    }
das tPW=="" ist halt solange der String leer ist soll er ein ASCI Zeichen auswerfen, das ist klar aber die weiteren fehlen mir halt ;(
 
Also du checkst ob der String gültig ist und erzeugst dann in der for-Schleife einen gültigen String, da er über die minimale Länge Zufallsbuchstaben erzeugt.

Daher ist die Prüfung auf Gültigkeit hier egal.

Anosnsten müsste man sowas wie
Code:
        if (tPW=="" || tPW.lenght() < solllaenge ){ return false; }
machen.


Und weitere Kriterien mit
Code:
if() else if () else if()

Und würde die Länge oder Form nicht korrekt sein, dann würde er die while schleife nochmal durchlaufen und das PW auf ="" setzen 😉 ==> Endlosschleife. (Nur wenn man das Kriterium der Länge hätte, was aber nach der for schleife immer erfüllt ist.)

Dein Ansatz ist höchst inperformant, da du solange ein PW raten lässt bis es deinen Ansprüchen genügt.

Bereits in dem anderen Thread wurde gezeigt, wie man das effizient machen kann.

Sprich man kann bei der Generierung schon darauf achten, dass die korrekte Form des PWs erzeugt wird.
 
Zuletzt bearbeitet von einem Moderator:
Übringens ... ich denke es sollte nicht
Java:
 if( tPW == "" )
heißen sondern :
Java:
 if ( tPW.equals("" )
.
 
Aber wenn ich jetzt z.B an die IF-Anweisung noch ||tPW<laenge eingebe, funktioniert da er die Variable laenge nicht zuordnen kann weil Sie weiter unten im Code gebraucht wird. Allerdings kann ich die IF-Kriterien ja auch nicht unten im Code schreiben da ich kein Rückgabe Wert bei Void benutzen kann. Weiss jemand wie ich das lösen kann? Also if(tPW=="" || tPW < laenge || tPW.contains usw.
 
Warum gehst du diesen komplizierten weg?

Du müsstest deiner Prüfmethode die Krierien schon mitteilen via Parameter oder Instanzvariablen.

Wieso stellst du bei der Generierung nicht sicher, dass

1) die Länge, die der User eingibt stimmt (Das machst du ohnehin schon, in deiner for schleife)
2) Von der gesamtlänge sollen nun X Buchstaben drin sein.

Beispiel:
Y = sollLänge
X = (X <= Y) Anzahl buchstaben
i = aktuelleLängeDesPW
a = anzahlBuchstaben.
Java:
for() {
     int buchstabeOderZahl = Randon[1 oder 0] // 1 Steht für Buchstabe)
      if((a < X && buchstabeOderZahl == 1) || Y -i + a - x  <= 0 ) {
          PW += getAscii();
         a++;
    } else {
      PW += Char.valueOf(Zufall 1..9);
    } 
}

Dann mischt man perZufall (Münzwurf) entweder eine Zahl oder ein Buchstaben rein.

Da muss man lediglich aufpassen, dass nicht nur zahlen kommen oder nicht nur buchstaben. Oder der String nicht zu lang wird.
 
Zuletzt bearbeitet von einem Moderator:
Klingt plausibel, danke für die Hilfestellung, das Problem ist das ich als Neuling meist automatisch die Komplizierteren Wege gehe, daher wollte ich eigentlich auch meinen Code beibehalten, da ich bei diesem wenigstens jeden Schritt nachvollziehen kann. Also gitb es die Möglichkeit wie ich es beschrieben habe die Kriterien oben abzufragen nicht? Auch wenns einfacher ist wie du schon sagst es direkt unten in der for schleife bei der Generierung zu überprüfen?
 
Klar gibt es diese Möglichkeiten es so zu machen, wie du es möchtest.

Wie das geht habe ich geschrieben. Welche Probleme das ergbit ebenfalls.

Gruß,

Marcinek
 

Zurück
Oben