ユーザがユーザ名またはパスワードを入力する必要があるログインフレームを作成しました。ユーザー資格情報は、MySQLデータベースに暗号化された形式(AES)で格納されます。テスト目的のために、アクセスボタンが押されたとき、フレームはtxtUsername
とtxtPassword
に入力されたデータを受け取り、暗号化し、txtEncUName
とtxtEncPword
に暗号化された資格情報を設定します。アプリケーションは、暗号化された資格情報とtxtEncUName
とtxtEncPword
テキストフィールドの暗号化されたデータを比較します。アプリケーションは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);
}
}
}
ユーザーのパスワードを決して暗号化しないでください。代わりに、ハッシュを使用する必要があります。強力なものはPBKDF2、bcrypt、scrypt、Argon2です。ハッシュ関数は単方向関数なので、ハッシュを "解読"することはできません。ユーザーを認証するには、データベースに格納されているハッシュと比較するために、ハッシュ関数を使用してパスワードを再度実行します。 [パスワードを安全にハッシュする方法](http://security.stackexchange.com/q/211/45523) –
パスワードのハッシュを使用すると思いますが、パスワードをハッシュすることを計画しています。アプリケーションは完了に近い。私はまだデータセキュリティを学んでいるので、AESをテストのために使用しました:)。しかし、リンクのおかげで、私は間違いなくそれを見てください – Osiris93