2016-07-29 3 views
0

ユーザがユーザ名またはパスワードを入力する必要があるログインフレームを作成しました。ユーザー資格情報は、MySQLデータベースに暗号化された形式(AES)で格納されます。テスト目的のために、アクセスボタンが押されたとき、フレームはtxtUsernametxtPasswordに入力されたデータを受け取り、暗号化し、txtEncUNametxtEncPwordに暗号化された資格情報を設定します。アプリケーションは、暗号化された資格情報とtxtEncUNametxtEncPwordテキストフィールドの暗号化されたデータを比較します。アプリケーションはMySQLデータベースのログインデータを比較しませんか?

資格情報が正しい場合、ユーザーにはアクセス権が与えられ、管理者アクセス権を持っているかどうかによってそれぞれのページに移動します。彼らのアカウントがロックされている場合、彼らはjLabelによって通知され、アクセスは許可されません。これを以前テストしたところ、問題なく動作しましたが、ここに問題があります:

ログインしようとすると、アプリケーションはすぐにアカウントにアクセスできません。私は資格情報をチェックして、彼らは正しいです。エラーは発生せず、スタックトレースも発生しません。

資格情報を正しく確認するにはどうすればよいですか?ここで

は、アクセスボタンに使用される方法です。

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

ユーザーのパスワードを決して暗号化しないでください。代わりに、ハッシュを使用する必要があります。強力なものはPBKDF2、bcrypt、scrypt、Argon2です。ハッシュ関数は単方向関数なので、ハッシュを "解読"することはできません。ユーザーを認証するには、データベースに格納されているハッシュと比較するために、ハッシュ関数を使用してパスワードを再度実行します。 [パスワードを安全にハッシュする方法](http://security.stackexchange.com/q/211/45523) –

+0

パスワードのハッシュを使用すると思いますが、パスワードをハッシュすることを計画しています。アプリケーションは完了に近い。私はまだデータセキュリティを学んでいるので、AESをテストのために使用しました:)。しかし、リンクのおかげで、私は間違いなくそれを見てください – Osiris93

答えて

1
String getAccess = "select * from login_db";  

上記のクエリは、データベースからすべての行を選択するが、コード...

if(rs.next()) 

...最初の行が一致するかどうかだけをチェックします。複数の行がある場合は問題が発生します。クエリを変更してユーザー名とパスワードの一致を検索することを検討してください。

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

それは働いてくれてありがとう! – Osiris93

関連する問題