【问题标题】:How to validate password in my passwordfield from mysql database?如何从 mysql 数据库验证我的密码字段中的密码?
【发布时间】:2016-01-16 14:55:39
【问题描述】:

我正在使用mysql数据库。

当我使用名称和 ID 从数据库进行验证时,我的代码正在工作。 但是当我使用密码进行验证时,我不能,因为它是散列/加密的。 我希望如果数据库中的密码与 id 匹配,则成功

我的验证按钮: 老师是我的餐桌

try {
        String url = "jdbc:mysql://localhost:3306/GradeSystem";
        String username = "root";
        String password = "";

        com.mysql.jdbc.Connection con = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, username, password);
        Statement stmt = con.createStatement();

        String sql="SELECT * from TEACHER";

        ResultSet rs = stmt.executeQuery(sql);
        String user=TID.getText();//variable name of my firsttxtfield
        String pwd= new String (TPASS.getText());//variable name of my 2nd txtfield
        int tmp=0;
        while(rs.next()) {
            String uname=rs.getString("TID");//TID name in my database
            String pssword=rs.getString("TPASS"); //TID name in my database
            if ((user.equals(uname)) && (pwd.equals(pssword)))
            {
                this.dispose();
                new TeacherAccount().setVisible(true);

                tmp++;

            }
        }
        if (tmp==0) {
            JOptionPane.showMessageDialog(null, "Incorrect Password and Username!");
        }
    }
    catch (Exception e){
        JOptionPane.showMessageDialog(this, e.getMessage());
    }//i know my code is unclean im trying to implement first :)

知道如何解决这个问题或任何其他解决方法来实现相同的解决方案吗?抱歉英语不好。

【问题讨论】:

  • 您也必须对给定的密码进行哈希处理,然后进行比较。
  • 我用它来插入 mysql:Password.getText() 并检索 Password.getText() = 这有效(密码可见)。但是当我使用插入 Password.getPassword 时,我不能使用 Password.getPassword?如何获取密码?

标签: java mysql validation jtextfield


【解决方案1】:

重点是您没有存储原始密码。因此,两个不同字符串的比较不可能是真的。所以,你需要这样的东西-

if(encodedPassword.equals(encode(rawPassword))) { /* They passed */ }

这会将原始字符串与数据库中编码的字符串进行比较。我建议您调查在数据库中插入密码的代码并使用相同的技术。

【讨论】:

  • 谢谢你们!!我现在用于插入的是存储到我的数据库中的 Password.getText(getText 是删除线) THAN Password.getPassword。因为如果我在存储中使用 Password.getPassword 我不知道为什么我不能在检索中使用 Password.getPassword。这是我从 db String pwd= new String (TPASS.getText()); 中选择的代码
  • @Tiny,我根据您的评论删除了 Spring 引用。恕我直言,现在似乎不太清楚。
  • @SevyNnez,我不理解你。除非发生了一些有趣的事情,否则我不确定getPassword 会如何插入任何内容。您可以将有问题的整个代码块添加到您的帖子中吗?
【解决方案2】:

这背后的想法是,如果您将密码作为原始密码存储在数据库中,然后进行比较

inputRawPassword.equals(dbRawpassword)

如果密码存储为散列,那么对于原始密码作为用户输入,再次使用与存储在数据库中时使用的散列相同的算法对其进行散列,然后比较两个散列,即

hashInputPassword = hashFunction(intputRawPassowd);
hashInputPassword.equals(dbHashPassword)

希望对你有帮助

【讨论】:

    【解决方案3】:

    你做错了。您根本不应该比较密码。让数据库使用它的散列函数来做到这一点,它与存储密码时使用的散列函数相同。你感兴趣的是一件事,而且只有一件事:

    • 是否有使用此用户名和密码的用户?

    所以你的 SQL 应该看起来像

    select count(*) from users where tid = ? and tpass = ?
    

    第二个在哪里?对于某些 f,可能会被 f(?) 替换。

    原因是您不想泄露任何信息,即使是您自己的应用程序,大意是用户ID 错误,或者用户ID 正确但密码错误。您只关心“用户存在”或“没有这样的用户”。您不希望攻击者知道它是什么,而实现这一点的故障安全方法是您自己不知道的。只有数据库知道。

    【讨论】:

    • 我只是想建议这个。干得好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多