5

こんにちは私はjavanetbeansIDEでログインフォームを作成しようとしています。私の目的は、複数のユーザーIDとそれぞれのパスワードを作成することです。値を取得するためにパスワードのuserIDとpasswordFieldにテキストフィールドを指定しましたが、問題はパスワードフィールドからテキストを取得したいのですが、エラーが表示されて取得できません。私の研究では構文に問題があると思います。次のように解決策はありますか?君の力が必要

private void lb_loginMouseClicked(java.awt.event.MouseEvent evt) {                                      
       DBUtil util = new DBUtil();
       String value1=tb_uid.getText();
       String value2=tb_pwd.getPassword();
       String user1="";
       String pass1="";
       try {

            Connection con = util.getConnection();
            PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");
            ResultSet res = stmt.executeQuery();
            res = stmt.executeQuery();
            while (res.next()) {
                user1 = res.getString("username");
                pass1 = res.getString("password");
            }
            if (value1.equals(user1) && value2.equals(pass1)) {
            JOptionPane.showMessageDialog(this,"correct");
            }
            else{
            JOptionPane.showMessageDialog(this,"Incorrect login or password","Error",JOptionPane.ERROR_MESSAGE);
            }
            JOptionPane.showMessageDialog(null, "COMMITED SUCCESSFULLY!");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());

        }

    }  
4

5 に答える 5

6

次のコードを使用します。

String password = String.valueOf(jPasswordField.getPassword());

JPasswordField暗号化されていますが、使用String.valueOfすると Char が String に変換されます。

于 2014-12-22T08:56:07.277 に答える
3

value2はchar配列であるため、String連結を行うと、コンテンツ自体がSQLで終わるStringのではなく、配列が表現されます。String交換できます

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' && password='"+value2+"'");

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username='"+value1+"' AND password='" + new String(value2) + "'");

同様に

if (value1.equals(user1) && value2.equals(pass1)) {

する必要があります

if (value1.equals(user1) && pass1.equals(new String(value2)) {

ただし、 SQLインジェクション攻撃PreparedStatementから保護するには、プレースホルダーを使用することをお勧めします。

PreparedStatement stmt = con.prepareStatement("SELECT * FROM login where username=? AND password=?);
stmt.setString(1, value1);
stmt.setString(2, new String(value2));

注:これはパスワード検索を行うための安全な方法ではありません。ハッシュ比較の方が比較的安全です。

于 2013-01-04T17:55:40.477 に答える
0

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#equals%28java.lang.Object%29から:

等しい

public boolean equals(Object anObject)

この文字列を指定されたオブジェクトと比較します。結果は、引数がnullでなく、このオブジェクトと同じ文字シーケンスを表すStringオブジェクトである場合にのみtrueになります。

あなたのコード:

char[] value2=tb_pwd.getPassword();
...
String pass1="";
...
...&& value2.equals(pass1)...

char配列をStringに変換してから、変換を再試行したいようです。それでもエラーが発生する場合は、関連する入力と一緒に投稿してください。受信内容を確認できます。

于 2013-01-04T17:55:14.173 に答える
0

char[]を に変換したいString。tb_pwd.getPassword() を呼び出すと、char[] (文字配列) が返されます。このパスワードを比較したい場合は、文字列に変換する必要があります。これには、次のメソッドを使用できます。

String final_pass = "";
for(char x : passwordAsChar[]) {
     final_pass += x;
}

データベース内のパスワードを比較する場合は、暗号化されていない平文でパスワードを保存しないでください。MD5 文字列をデータベースに保存し、ユーザーが入力したパスワードを文字列に変換してから、次のメソッドを呼び出すことができます。次に、返された文字列をデータベースからのものと比較します。一致する場合、ユーザーは正しいパスワードを入力しています。

例:

char[] pass = tb_pwd.getPassword();
String final_pass = "";
for (char x : pass) {
    final_pass += x;
}

String md5_encrypted_pass_userInput = encrypt(final_pass);
if (md5_encrypted_pass.equals(pass1)) { /* pass1 = the password from the database */
    // Correct password
}

文字列を MD5 に暗号化するために使用する方法は次のとおりです。

public static final String encrypt(String md5) {
    try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {}
    return null;
}
于 2013-01-04T20:46:44.140 に答える