Ionman Geschrieben 23. April 2009 Geschrieben 23. April 2009 Hallo zusammen, bin das erstemal dabei in Java ein Applet zu schreiben welches einen Login erfodert. Dabei hab ich in der Datenbank (MySQL) die Passwörter natürlich verschlüsselt (md5). Wenn ein Benutzer sich nun anmelden will muss ich das eingegebene pw von ihm natürlich "umwandeln" um die Hashs zu vergleichen. und genau das bringt mich zu meiner Frage. Gibt es in Java keine Methode um einen String in einen md5 Hash umwandeln zu können, oder bin ich einfach zu doof um richtig zu googeln? Schonmal vorab danke für die Hilfe. Gruß Ionman Zitieren
DominikJ Geschrieben 23. April 2009 Geschrieben 23. April 2009 Ich denke 2teres (Nicht ernst nehmen) import java.security.*; class MD5 { public static void main(String[] args) throws Exception { /* Berechnung */ MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.reset(); md5.update(args[0].getBytes()); byte[] result = md5.digest(); /* Ausgabe */ StringBuffer hexString = new StringBuffer(); for (int i=0; i<result.length; i++) { hexString.append(Integer.toHexString(0xFF & result[i])); } System.out.println("MD5: " + hexString.toString()); } } MessageDigest (Java 2 Platform SE v1.4.2) Nimmt halt nur Byte bzw Bytearrays entgegen und keine Strings. Zitieren
flashpixx Geschrieben 23. April 2009 Geschrieben 23. April 2009 Warum so kompliziert, wenn Du eh ein SQL Select erzeugen musst, dann kannst Du auch die Datenbank dazu verwenden den Hash zu erzeugen: Select count(*) from mytable where username=? and userpass=md5(?) Das ganze in ein Prepareobjekt rein und ausführen lassen. Wenn ein Resultset existiert, d.h. User und Passwort sind korrekt. Das das Resultset Null bzw enthält keine Records, dann stimmt entweder Benutzername und/oder Passwort nicht Phil Zitieren
DominikJ Geschrieben 23. April 2009 Geschrieben 23. April 2009 Select count(*) from mytable where username=? and userpass=md5(?) Ist natürlich auch möglich, aber danach wurde ja nicht gefragt. Aber aus 'Sicherheitsaspekten' ist das natürlich auch nicht so schön da es dann zwischen Java + SQL-Server klartext rumschwirrt. Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 Dank euch beiden für die Hilfe. Hab nun den von DominikJ vorgeschlagenen Weg eingeschlagen. Und nach ein paar wenigen Anpassungen Funktioniert das ganze Wunderbar. Sodele damit begehbe ich mich mal wieder in die weiten des Internets und suche über google mal nach einem Tutorial wie man richtig Googelt. In diesem Sinne früh vorweg ein schönes Wochenende Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 ok nun hab ich doch Festgestellt das es ein Problem gibt und ich steig einfach nicht dahinter. Die Verschlüsselung wurde von md5 auf sha1 geändert. Also denk ich mir naja einfach mal anstatt MessageDigest sha = MessageDigest.getInstance("MD5"); MessageDigest sha = MessageDigest.getInstance("SHA1"); einfügen. Der rest sollte eigentlich gleich von statten gehen. Gebe ich zu Beispiel test ein erstellt er mir jedesmal einen anderen Hash Wert sobald ich die Fenstergröße verändere. Also wenn er zuvor mit 4f20 angefangen hat kann es nach der größen Veränderung sein das es mit b5f2 losgeht. Ich kann ausschliessen das es daran liegt das die Variable welches das Passwort beinhaltet, jedesmal einen anderen Wert hat. Der Wert bleibt auch gleich bei selber Fenster Größe. Hier mal der Code: String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname; conn = DriverManager.getConnection(url, user, password); ResultSet rs = conn.createStatement().executeQuery( "SELECT `ID` FROM `user` WHERE `Username` LIKE '"+name+"'; StringBuffer hexString = new StringBuffer(); while ( rs.next() ) { String id = rs.getString("ID"); String pw = passwordeintragen.toString(); try { MessageDigest sha = MessageDigest.getInstance("SHA1"); sha.reset(); sha.update(pw.getBytes()); byte[] result = sha.digest(); for (int i=0; i<result.length; i++) { hexString.append(Integer.toHexString(0xFF & result[i])); } fuehler.setText(hexString.toString()); } catch (NoSuchAlgorithmException d) { fuehler.setText(d.toString()); } Zitieren
DominikJ Geschrieben 24. April 2009 Geschrieben 24. April 2009 Da fehlt ein "-". MessageDigest unterstützt: - MD2 - MD5 - SHA-1 - SHA-256 - SHA-384 - SHA-512 Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 Habs grad eben versucht und brachte keinen unterschied. Sobald ich wieder die Fenstergröße Verändert habe wurde ein komplett andere Wert Berechnet. Zitieren
DominikJ Geschrieben 24. April 2009 Geschrieben 24. April 2009 byte[] textBytes = "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern".getBytes(); MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(textBytes); byte[] digest = md.digest(); for (byte b : digest) { out.printf("%02x", b & 0xff); } Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 Hab das ganze mal 1:1 (bis auf Variable) so übernommen und habe immernoch die für mich auf jedenfall Schlechte Nachricht das es keine Veränderung gebracht hat. Falls noch Ideen vorhanden wäre ich auf jedenfall Dankbar. DominikJ danke dir auf jedenfall schonmal für die bissherige Hilfe. Zitieren
DominikJ Geschrieben 24. April 2009 Geschrieben 24. April 2009 Dann liegt es zu 100% an deiner Variable! ... was is denn eigentlich passwordeintragen ? Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 passwordeintragen ist ein JPasswordField. Nun gut wenn es an meiner Varaible liegt dann werd ich da mal schaun. Nur warum kommt auch jedesmal wenn ich es Jungfräulich starte dann ebenfalls ein komplett anderer Hash Wert? Zitieren
DominikJ Geschrieben 24. April 2009 Geschrieben 24. April 2009 passwordeintragen ist ein JPasswordField. Dann mach mal anstatt .toString() nen .getText() daraus ... toString gibt dir das Objekt aus ... Zitieren
Ionman Geschrieben 24. April 2009 Autor Geschrieben 24. April 2009 ah guter Tip. Vielen dank endlich klappt es und ich kann Seelenruhig zum nächsten Problem hinarbeiten. Und da dies für heute mein Letzter Post war einmal ein schönes Wochenende an alle. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.