String-Vergleich funktioniert nicht

Tinipieps

Mitglied
Hallo!
Ich habe möchte einen kodierten String in einer DB mit einem aktuell kodierten String vergleichen.
Durch ein System.out.println wird in der Konsole der gleiche String ausgegeben, aber in der Schleife springt er immer in die else-Anweisung

Code:
password.addKeyListener(new KeyListener () {

			@Override
			public void keyPressed(KeyEvent e) {
				int key = e.getKeyCode();
				if ( key == KeyEvent.VK_ENTER){
				
					DBAccess db = new DBAccess();
					db.connect();
					
					String passwd = new String(password.getPassword());
					
					System.out.println("Kodierter String: "+
							Coding.createCoding(username.getText(), passwd));
					System.out.println("String aus DB: "+db.getItems());
					
					if ( Coding.createCoding(username.getText(), passwd)
							.equals(db.getItems())){
						String nutzer = username.getText();
						System.out.println("Nutzer: "+nutzer);
						
						LogIn.this.setVisible(false);
						// gibt Speicher wieder frei
						dispose();
						
						Client client = new Client();
						client.setAbsender(nutzer);
					} else {
						JOptionPane.showMessageDialog(null, 
								"Passwort leider falsch.", "Error Message", 
									JOptionPane.ERROR_MESSAGE);
					}

				}
				
			}

Ausgabe in Konsole:
Kodierter String: ƒøÐ?
String aus DB: ƒøÐ?

Kann mir jemand weiterhelfen? Warum sieht er die Strings nicht als gleich an?
 
Moin,

ich weiß nicht, was Dein "Coding.createCoding" genau macht, aber schau doch mal mit dem Debugger, was genau an beiden Stellen steht (ggf. mal das Resultat von "Coding.createCoding"in einen String schreiben) ...

Unter Umständen haben sich Leerzeichen, Zeilenumbrüche, sonstige nicht darstellbare Zeichen eingeschlichen (!)

Gruß
KLaus
 
Moin,

(ggf. mal das Resultat von "Coding.createCoding"in einen String schreiben) ...

Da hab ich doch gemacht

Ansonsten hier mal die Methode:
Code:
public static String createCoding(String userName, String password){
		
		String encoded = null;
		
		try{
			MessageDigest digest = MessageDigest.getInstance("SHA-1");
			digest.reset();
			byte[] saltedBytes = (userName + password).getBytes("UTF-8");
			byte[] hashedBytes = digest.digest(saltedBytes);
			encoded = new String(Base64.decodeBase64(hashedBytes));
		}catch(Exception e){
			e.printStackTrace();
		}
		
		System.out.println(encoded);
		return encoded;
	}
 
Moin,

Das hab ich doch gemacht

na ja, Deine Methode gibt zwar einen String zurück, was ich aber meinte, war, dass Du diese Rückgabe in eine neue String-Variable schrieben und dann mit dieser im obigen Code sollst.

Deine Vorgehensweise ist natürlich korrekt, aber wenn Du eine neue Variable für den Vergleich hast, kannst Du sie leichter im Debugger testen (oder notfalls mit "System.err.println ( "..." ) ausgeben) !!

Wie gesagt, ich tippe auf Leerzeichen, Zeilenumbrüche etc. ;)

Gruß
Klaus

EDIT: vielleicht hast Du ja auch Du Deine Zeichensatz-Codierungen innerhalb von "createCoding" Unterschiede ... ;-]
 
Moin,



na ja, Deine Methode gibt zwar einen String zurück, was ich aber meinte, war, dass Du diese Rückgabe in eine neue String-Variable schrieben und dann mit dieser im obigen Code sollst.

Meinst du das so?
Code:
[password.addKeyListener(new KeyListener () {

			@Override
			public void keyPressed(KeyEvent e) {
				int key = e.getKeyCode();
				if ( key == KeyEvent.VK_ENTER){
				
					DBAccess db = new DBAccess();
					db.connect();
					
					String passwd = new String(password.getPassword());
					String codedString = new String(
							Coding.createCoding(username.getText(), passwd));
					String dbString = new String(db.getItems());
					
					System.out.println("Kodierter String: "+
							codedString);
					System.out.println("String aus DB: "+dbString);
					
					if ( codedString.equals(dbString)){
					
						String nutzer = username.getText();
						System.out.println("Nutzer: "+nutzer);
						
						LogIn.this.setVisible(false);
						// gibt Speicher wieder frei
						dispose();
						
						Client client = new Client();
						client.setAbsender(nutzer);
					} else {
						JOptionPane.showMessageDialog(null, 
								"Passwort leider falsch.", "Error Message", 
									JOptionPane.ERROR_MESSAGE);
					}

				}
				
			}
 
Moin,

genau, nur die Textausgabe fehlt noch :

Java:
if( codedString.equals(dbString) )
{
    System.out.println( "codedString: <" + codedString + ">");
    System.out.println( "dbString: <" + dbString + ">");

    // ...
} 
else 
{
    JOptionPane.showMessageDialog( null, "Passwort leider falsch.", "Error Message", JOptionPane.ERROR_MESSAGE );
}

Noch besser ist natürlich auf die Zeile mit dem IF einen Breakpoint zu setzen und den Debugger zu befragen, dann Du ganz analysieren, was auf beiden Strings steht ! :p

Gruß
Klaus
 
Das sysout hab ich vor der Schleife gemacht, da er ja gar nicht in die Schleife geht.
Er springt immer sofort in die else-Schleife.
Bin langsam echt ratlos. Man muss das doch vergleichen können. Oder wie kann man das sonst mit ner Passwortabfrage regeln?
 
Hab jetzt mal die Schleife mit nem kleinen Trick umgangen
Code:
String passwort = "Test";
					String benutzer = "Test";
					if (passwort.equals(benutzer)){

Ausgabe auf Konsole:
Code:
Kodierter String: ƒøÐ?
String aus DB: ƒøÐ?
codedString: ƒøÐ?
dbString: ƒøÐ?

Sehe immernoch keinen Unterschied.
 
Ok, hast natürlich Recht ... entweder VOR der Schleife oder halt im else-Fall ... ;)

Hast Du denn nun mal mit dem Debugger drauf geschaut :confused:
Wenn es - wie ich vermute - nichtdarstellbare Zeichen sind (bspw. kleiner als 0x20), dann wirst Du auch über Deine Konsole nicht wirklich dahinter kommen ...
In solchen Fällen ist immer der Debugger der beste Freund des Programmiers ;-]

Gruß
Klaus

EDIT: Vergleich kannst Du mit Sicherheit - nur wenn die Terme halt nicht gleich sind, dann sind sie es nicht .....
 
Ich muss zugeben, dass ich noch nicht so richtig mit dem Debugger gearbeitet habe!
Wenn ich den Breakpoint genau an die if-schleife setze, passiert doch nichts.
Was soll ich da denn machen? Ver steh ich nicht! Aber, wie gesagt, arbeite auch nicht wirklich im Debug-Modus.
 
Zurück