2016-07-29 4 views
0

Ich habe einen Login-Rahmen erstellt, wo der Benutzer einen Benutzernamen oder ein Passwort eingeben muss. Die Benutzeranmeldeinformationen werden in einem verschlüsselten Format (AES) in einer MySQL-Datenbank gespeichert. Zu Testzwecken, wenn die Zugriffstaste gedrückt wird, nimmt der Rahmen die in txtUsername und txtPassword eingegebenen Daten, verschlüsselt sie und stellt die verschlüsselten Anmeldeinformationen in txtEncUName und txtEncPword ein. Die Anwendung vergleicht dann die verschlüsselten Anmeldeinformationen mit den verschlüsselten Daten in den Textfeldern txtEncUName und txtEncPword.Anwendung nicht Login-Daten in MySQL-Datenbank vergleichen?

Wenn die Anmeldeinformationen korrekt sind, wird dem Benutzer Zugriff gewährt und er wird auf die entsprechende Seite weitergeleitet, je nachdem ob er Administratorzugriff hat oder nicht. Wenn ihr Konto gesperrt wurde, werden sie von einem jLabel benachrichtigt und der Zugriff wird nicht gewährt. Als ich das vorher getestet habe, funktionierte das einwandfrei, aber jetzt ist hier mein Problem:

Wenn ich versuche, mich anzumelden, sagt die Anwendung sofort, dass das Konto nicht zugänglich ist. Ich habe die Zugangsdaten überprüft und sie sind korrekt. Es treten keine Fehler auf und der Stack-Trace wird ebenfalls nicht angezeigt.

Was kann ich tun, damit die Anmeldeinformationen richtig überprüft werden? Hier

ist die Methode für die Zugriffstaste verwendet:

public void loginMethod() 
{ 
String user = txtUsername.getText(); 
     String pwd = new String(txtPassword.getPassword()); 

     try 
     { 
      String enc1 = LoginFrame.encrypt(user); 
      String enc2 = LoginFrame.encrypt(pwd); 

      encUname.setText(enc1); 
      encPword.setText(enc2); 

      String aes1 = encUname.getText(); 
      String aes2 = encPword.getText(); 

      String getAccess = "select * from login_db";    

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection conn = (Connection) 
      DriverManager.getConnection("jdbc:mysql://localhost:3306/user_db","root","password"); 
      Statement stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery(getAccess); 

      if(rs.next()) 
      { 
       String username = rs.getString("emp_num"); 
       String password = rs.getString("pword"); 
       String access = rs.getString("adminAccess"); 
       String locked = rs.getString("accLocked"); 

       if((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("Yes"))&& ("No".equals(locked))) 
       { 
        AdminPage ap = new AdminPage(); 
        ap.setVisible(true); 
        this.dispose(); 
       } 

       else if ((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("No"))&& ("No".equals(locked))) 
       { 
        EmployeeMainPage emp = new EmployeeMainPage(); 
        emp.setVisible(true); 
        this.dispose(); 
       } 

       else if((aes1.equals(username)) && (aes2.equals(password)) && (access.equals("Yes"))&& ("Yes".equals(locked))) 
       { 
        lblWrongLogin.setVisible(true); 
        lblWrongLogin.setText("Account inaccesible, please contact admin for support."); 
       } 
       else if((locked.equals("Yes"))) 
       { 
        lblWrongLogin.setVisible(true); 
        lblWrongLogin.setText("Account inaccessible, please contact admin for support."); 
       } 
     } 
     } 

     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(this, e); 
     } 
    } 
} 
+1

Sie sollten niemals die Kennwörter Ihres Benutzers verschlüsseln. Sie müssen stattdessen Hashing mit einigen starken PBKDF2, bcrypt, scrypt und Argon2 verwenden. Da Hash-Funktionen eine Einwegfunktion sind, können Sie die Hashes nicht "entschlüsseln". Um Ihren Benutzer zu authentifizieren, können Sie das Passwort erneut über die Hash-Funktion ausführen, um es mit dem Hash zu vergleichen, der in der Datenbank gespeichert ist. Weitere Informationen: [Wie sichere Passwörter sicher zu hacken?] (Http://security.stackexchange.com/q/211/45523) –

+0

Ich weiß, dass Sie Hashing für Passwörter verwenden sollen und ich plane Hashing der Kennwörter, wenn die Anwendung ist näher an der Fertigstellung. Ich habe gerade AES als Test verwendet, da ich immer noch Datensicherheit lerne :). Aber danke für den Link, ich werde definitiv darüber schauen – Osiris93

Antwort

1
String getAccess = "select * from login_db";  

Die obige Abfrage wählt alle Zeilen aus der Datenbank, aber der Code ...

if(rs.next()) 

... überprüft nur, ob die erste Zeile übereinstimmt - es gibt Probleme, wenn mehr als eine Zeile vorhanden ist. Erwägen Sie, die Abfrage zu ändern, um nach Übereinstimmungen mit Benutzername und Kennwort zu suchen

PreparedStatement ps = conn.prepareStatement("select * from login_db where emp_num=? AND pword=?"); 
ps.setString(1, aes1); 
ps.setString(2, aes2); 
ResultSet rs = ps.executeQuery(); 
if (rs.next()){ 
    //logic here 
} 
+0

Danke, dass es funktioniert hat! – Osiris93