Code:
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()));
}
}
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.