TDM Geschrieben 11. April 2006 Geschrieben 11. April 2006 Hallo, ich habe folgendes Problem: eine Klasse Person stellt in meinem Programm die Benutzer dar. Diese loggen sich über einen Anmeldedialog ein. Das ganze funktioniert jetzt mit unverschlüsseltem Passwort - ich würde das aber gern mit md5 verschlüsseln (warum ich kein unverschlüsseltes Passwort haben möchte, dürfte klar sein und md5 erscheint mir als sicher genug) dazu habe ich jetzt folgende Funktion geschrieben: private String getEncryptedPassword(String pwd) { if (pwd != null) { try { byte[] md5pwd = MessageDigest.getInstance("MD5").digest( pwd.getBytes()); return md5pwd.toString(); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } } return null; } Problem ist jetzt nur, dass jedesmal wenn ich auf ok (im Anmeldedialog) klicke das verschlüsselte Passwort anders ist... Für ein Password hab ich jetzt z.B. diese Passwörte: [b@2b9406 [b@7976c1 [b@4204 [b@b1cd0 [b@1367e28 dabei hab ich natürlich immer alles gleich geschrieben (Case Sensitiv...) Ich weis absolut nicht warum das immer anders ist... Egal was ich mache - immer anders Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 Ok, anscheinend war eine Funktion nicht ausreichend... Hab jetzt alles in einer lokalen Klasse realisiert: class MD5 { private String text = null; private String hash = null; /** * <u>Konstruktor mit Übergabe der zu verifizierenden Zeichenkette</u> * @param text */ public MD5(String text) { this.text = text; } /** * <u>Zurückgabe des MD5-Hashes, bei Initialisierter Membervariable 'text'</u> * @return */ public String getMD5() { return text != null ? makeMD5() : null; } /** * <u>Zurückgabe des MD5-Hashes</u> * @param text * @return */ public String getMD5(String text) { this.text = text; return text != null ? makeMD5() : null; } /** * <u>MD5-Hash erzeugen</u> * @return */ private String makeMD5() { MessageDigest md = null; byte[] encryptMsg = null; try { md = MessageDigest.getInstance( "MD5" ); // getting a 'MD5-Instance' encryptMsg = md.digest(text.getBytes()); // solving the MD5-Hash }catch (NoSuchAlgorithmException e) { System.out.println("No Such Algorithm Exception!"); } String swap=""; // swap-string for the result String byteStr=""; // swap-string for current hex-value of byte StringBuffer strBuf = new StringBuffer(); for(int i=0; i<=encryptMsg.length-1; i++) { byteStr = Integer.toHexString(encryptMsg[i]); // swap-string for current hex-value of byte switch(byteStr.length()) { case 1: // if hex-number length is 1, add a '0' before swap = "0"+Integer.toHexString(encryptMsg[i]); break; case 2: // correct hex-letter swap = Integer.toHexString(encryptMsg[i]); break; case 8: // get the correct substring swap = (Integer.toHexString(encryptMsg[i])).substring(6,8); break; } strBuf.append(swap); // appending swap to get complete hash-key } hash = strBuf.toString(); // String with the MD5-Hash return hash; // returns the MD5-Hash } /** * <u>Setzt den Text, aus dem der MD5-Hash ermittelt werden soll</u> * @param text The text to set. */ public void setText(String text) { this.text = text; } /** * <u>Gibt den Text, aus dem der MD5-Hash ermittelt werden soll zurück</u> * @return Returns the text. */ public String getText() { return text; } /** * <u>Konstruktor mit Übergabe der zu verifizierenden Zeichenkette</u> * @return Returns the hash. */ public String getHash() { return hash; } } Zitieren
Jaraz Geschrieben 11. April 2006 Geschrieben 11. April 2006 Ich weis absolut nicht warum das immer anders ist... Egal was ich mache - immer anders Das Passwort ist immer dasselbe, nur bekommst du immer eine andere byte[] Instanz zurück, dessen id du ausgibst. Du gibst nicht den Inhalt des byte arrays aus, den bekommst du mit z.B. System.out.println(new String(deinByteArray)); Gruß Jaraz Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 gut zu wissen merk ich mir für die zukunft, danke Zitieren
Pinhead Geschrieben 11. April 2006 Geschrieben 11. April 2006 Wo wir gerade beim Thema Md5 Verschlüsselung sind. Ich hatte da letztens ein für mich unerklärliches Verhalten. Die Passwörter waren MD5 verschlüsselt in einer Oracle Datenbank abgelegt. Das eingegebene Passwort wurde mit der gleichen Funktion MD5 verschlüsselt mit der auch die Passwörter in der Datenbank verschlüsselt wurden. Der Vergleich hat funktioniert wenn ich das ganze vom lokalen Testserver aus geamcht habe. Nachdem ich die Anwendung allerdings auf den Apllication Server deployt habe konnte ich mich nicht mehr anmelden. Lokaler Testserver läuft auf Windows NT Application Server Solaris 9 Kann mir jemand dieses merkwürdige Verhalten erklären und nen Tipp geben wie ich das abstellen kann. Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 gleiche daten und gleicher src ? war das eine Java oder Oracle (PL/SQL) funktion? was für ein JDBC (oder SQLJ) ? Edit: Hast du dir den Anmeldestring für die DB mal ausgeben lassen ? Zitieren
Pinhead Geschrieben 11. April 2006 Geschrieben 11. April 2006 Verschlüsselt habe ich das ganze mit einer Java Klassen. So wie in dem Code Beispiel oben. Sourcen und Daten sind gleich. Beim ausgeben des Anmeldestrings sind die beiden auf dem lokalen Testserver gleich auf dem App Server unterschiedlich Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 Welches Beispiel ? Funktion oder Klasse ? Zitieren
Pinhead Geschrieben 11. April 2006 Geschrieben 11. April 2006 Klasse ! Ich würde ja den Code auch posten aber ich hab ihn erst Anfang nächster Woche wieder zugänglich Zitieren
TDM Geschrieben 11. April 2006 Autor Geschrieben 11. April 2006 Funktioniert die Datenbankanbindung richtig ? (Treiber getauscht) oder läuft das in der Oracle VM ? 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.