# Passwortgenerator mit PBKDF2



## iboteng (27. Dez 2016)

```
package Pruefung1;


public class Zeichengenerator {
//man hätte es auch mit nem string machen können allerdings der selbe effekt , aber hier hätten man den string in Char umwandeln müssen deshalb lieber nur char
static String erlaubteZeichen =
"0123456789"
+ "AaBbcdefghijklmnopqrstuvw"
+ "ABCDEFGHIJKLMNOP"
+ "!Â§$%&?*+#";
  //string wird in chars umgewandelt damit man die späözter in bytes umwandeln kann
//das sind die erlaubten Zeichen aber nur die ersten 16 werden benutzt kannst die reihenfolge ändern wie du möchtest
  final protected static char[] hexArray = new char [] { 'A', 'B', 'C', 'D',

'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',

'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',

'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',

'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' +

'0', '1', '2', '3', '4',

'5', '6', '7', '8', '9'

+ '~', '`', '!', '@', '#',

'$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', '{',

']', '}', '\\', '|', ';', ':', '\'', '"', ',', '<', '.', '>', '/',

'?' };
  // daten werden in Bytes umgewandet in die ersten 16 chars von oben
 

  public static String bytesToHex(byte[] bytes) {
      System.out.println(bytes.length);//liefert uns nur 4 Bytes aus das ist Problem warum nur 4 Bytes
    char[] hexChars = new char[bytes.length * 10];
  //  for(int j:bytes){
    for (int j = 0; j < bytes.length; j++) {
      int v = bytes[j] & 0xFF;
    hexChars[j * 2] = hexArray[v >>> 4];
      hexChars[j * 2 + 1] = hexArray[v & 0x0F]; // hier liegt der <<fehler wegen 16 Zeichen
    }
    return new String(hexChars);
  }
 
}
package Pruefung1;



import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Scanner;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;


public class Main {
  public static void main(String args[]) throws Exception {
    Main Prog1 = new Main();
    Prog1.run();
    }

  void run() throws NoSuchAlgorithmException, InvalidKeySpecException {
Scanner scan = new Scanner(System.in);
  
//hier musst du noch inputs durch scanner ändern lassen
   String masterpasswort ;
   String konto ;   
   String kennung ;
  int laenge =0;
  
  System.out.println("Bitte Kennung eingeben:");
  kennung = scan.nextLine();
 
  System.out.println("Bitte Konto eingeben:");
   konto = scan.nextLine();
  
   System.out.println("Bitte Masterpasswort eingeben:");

   masterpasswort= scan.nextLine();
 
  
  //solange es kleiner als 8 ist
  
while(laenge<8){
System.out.println("Bitte Länge für das neue Passwort größer als 8 eingeben:");
while (laenge<8 && !scan.hasNextInt()) scan.next();
laenge = scan.nextInt(); }
 
   System.out.println("Bitte geben Sie eine Zahl für die Versionsnummer ein:");
   //integer werden hiermit nicht direkt gescant deshalb die while schleife
   while (!scan.hasNextInt()) scan.next();
   int versionsnummer = scan.nextInt();
  
  
  
  
   String initKey= masterpasswort+konto+kennung;
  
 

   //umwandeln von in auf String um später als string benutzt zu werden
   String vn = String.valueOf(versionsnummer);
  
  
  
  
   
    PBEKeySpec spec0 = new PBEKeySpec(initKey.toCharArray(),
   
   
   
   
   
   // versionsnummer und länge in Bytes das heißt länge mal 4 ergibt die untere zahl
    vn.getBytes(), 100, laenge*4);// nachforschen get Bytes um längeres Arrays
  
   
    //spezifiert den algorithmus welcher für das hashen benutzt werden soll
    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
    SecretKey spec1 = skf.generateSecret(spec0); 
   
   
    //die ausgabe erfolgt halt in den ersten 16 "zeichen" deines erlaubtenZeichensdings deshalb nur bis P du kannst da halt die reihenfolge wie du möchtest ändern
    System.out.println("Ihr mit PBKDF2 neugeneriertes Passwort lautet: " + Zeichengenerator.bytesToHex(spec1.getEncoded()));

  }
 
}
```
Guten Tag,
ich soll ein Passwortgenerator erstellen, der aus den 4 Eingaben: URL, Masterpasswort, Kennung und Visionsnummer ein Passwortgenerator erstellen, mithilfe der PBKDF2 Funktion.
Wenn ich die Visionsnummer auf 2 ändere soll ein neues Passwort generiert werden und bei der Eingabe der gleichen Daten muss das Passowort gleich bleiben.
Ich habe ein Programm programmiert, jedoch spucht es nur die ersten 16 Zeichen aus dem Array aus, und das mit der  Visionsnummer funktioniert nicht so ganz.


----------



## VirtualIndex (27. Dez 2016)

Hallo iboteng,

willkommen im Forum. Erstmal ein paar Grundlegende Dinge zur Fragestellung:
- Achte auf die richtige Kategorie, in der du deinen Beitrag verfasst, in Foren: Dein Thema hat nichts mit Spiele- oder Multimediaprogrammierung zu tun.
- Bitte achte immer darauf, dass die Formatierung deines Quellcodes stimmt. Ansonsten kann man ihn schlecht lesen und man macht mehr Fehler, als nötig ist. Zudem schreckt es Menschen ab, den Quellcode zu lesen - du bekommst dadurch weniger Hilfestellungen.
- Du verwendest momentan einen Code-Tag für deinen gesamten Quellcode. Am Besten verwendest du in Zukunft pro Klasse (oder anderen Gliederungen) einen Code-Tag. Alles in einem Code-Tag macht die Sache sehr unübersichtlich. Zudem kannst du, damit Syntax-Highlighting geht, Java als Sprache angeben.
- Reduziere deinen Quellcode beim Fragen in Foren auf das für das Problem Wesentliche. Lass alles andere weg, also beispielsweise package-Angaben, unrelevante Methoden, Klassen und Attribute/Eigenschaften.
- Die Angabe "funktioniert nicht ganz" ist nicht hilfreich: Was genau geschieht momentan und wie soll es ganz genau eigentlich sein?


Nun zu dem, was du gut gemacht hast:
- Du hast deinen Quellcode kommentiert und damit versucht dem Leser deine Gedanken und Intentionen hinter dem Quellcode nahezubringen.
- Statt aufzugeben oder dich mit etwas Halbherzigen zufrieden zu geben hast du in einem Forum nachgefragt. Fragen stellen und Hinterfragen sind wichtige Kompetenzen von Entwicklern.

Was du besser machen könntest:
- Formatiere deinen Quellcode richtig.
- Manche deiner Kommentare sind relativ lang. Kürze Sie aufs Wichtigste oder nutze mehrzeilige Kommentare, statt alles in eine Zeile zu packen.
- Nenne Klassen oder andere Dinge nicht wie Schlüsselwörter: Eine Klasse mit dem Namen main ist eine schlechte Idee, auch wenn es funktioniert. Alternativ kannst du für deine Main-Klasse beispielsweise den Namen App für Applikation verwenden.
- verwende getter- und Setter-Methoden (sofern nötig) und verwende stets die niedrig-möglichste Sichtbarkeit (in der Regel private, vermeide public)
- achte auf Fehler- und Warnmeldungen deiner Entwicklungsumgebung. Eclipse sagt mir, dass du einen Resource Leak hast, weil dein Scanner nie geschlossen wird, selbst wenn du ihn nicht mehr benötigst: Bestimmte Klassen haben Methoden namens close. Rufe immer die close-Methode so früh wie möglich auf, wie es möglich ist. Das heißt hier konkret: Wenn du mit dem Einlesen der Eingaben fertig bist, darfst du den Scanner mit der close-Methode schließen.
- Lösche ungenutzte Methoden, Importe, Variablen usw. aus deinem Quellcode. Sie bringen keinen Mehrwert und verwirren später nur. Guter Code, ist gepflegter Code.
- Verwende bei Dingen, wo du weißt, dass es noch Arbeit zu tun gibt, weil sie fehlerhaft oder unvollständig implementiert sind, das Schlüsselwort TODO am Anfang eines Kommentars. Dann kann dir deine Entwicklungsumgebung die Stellen zeigen, an denen noch TODOs zu erledigen sind.
- Du kannst das Erzeugen deiner Main-Klasse einsparen. Du kannst deine run-Methode einfach weglassen und direkt in die main-Methode integrieren.
- Verzichte in der Regel lieber auf static und mache aus deinen static-Variablen und static-Methoden einfache Aufrufe. Du musst dann natürlich zuvor ein entsprechendes Objekt erzeugen.

Ich schlage vor, dass du diese Dinge erst einmal umsetzt und insbesondere das Problem genauer erklärst und es versuchst einzugrenzen. Danach kann man nochmal schauen, aber momentan würde sich zu viel vom Quellcode ändern, so dass wir hier im Forum lieber erst nach den Änderungen nochmal genauer schauen.


----------



## iboteng (5. Jan 2017)

Ich danke dir vielmals das Programm läuft zum Glück, ich werde noch probieren die Methode Scanner mit JOptionPane zu ändern. Jedoch habe ich ein Problem, mein Programm gibt zu wenig Bytes aus, es nimmt nur die ersten Zeichen aus Meinen Array die restlichen beachtet das Programm leider nicht für die Erzeugung eines Passworts. Ich könnte euch das mal zeigen.

```
final protected static char[] hexArray = new char [] { 'A', 'B', 'C', 'D',

             'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',

             'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',

             'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',

             'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' +

             '0', '1', '2', '3', '4',

             '5', '6', '7', '8', '9'

             + '~', '`', '!', '@', '#',

             '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', '{',

             ']', '}', '\\', '|', ';', ':', '\'', '"', ',', '<', '.', '>', '/',

             '?' };
```


```
public static String bytesToHex(byte[] bytes) {
   StringBuffer sb = new StringBuffer();
    for (int i = 0; i < bytes.length; i++){
     
       sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
    }
    return sb.toString();
}
 
  }
```

Ich schätze mal der Fehler liegt bei der Methode Stringbuffer ,irgendwas fehlt dort, weshalb dieser zu wenig Bytes ausgibt


----------

