我正在使用mysql数据库。
当我使用Name和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 :)
任何想法如何解决这个或任何其他的解决方法来实现相同的?对不起英语。
答案 0 :(得分:1)
重点是你没有存储原始密码。因此,两种不同的字符串的比较是不可能的。所以,你需要这样的东西 -
if(encodedPassword.equals(encode(rawPassword))) { /* They passed */ }
这会将原始字符串与数据库中编码的字符串进行比较。我建议你研究在数据库中插入密码并使用相同技术的代码。
答案 1 :(得分:1)
你做错了。你根本不应该比较密码。让数据库使用其散列函数执行该操作,与存储密码时使用的相同。你感兴趣的只是一件事,一件事:
所以你的SQL应该看起来像
select count(*) from users where tid = ? and tpass = ?
第二个?对于某些 f ,可能会被 f(?)替换。
原因是您不想泄漏(甚至是您自己的应用程序)任何有关userID错误的信息,或者它是正确的但是密码错误。你关心的只是用户存在'或者'没有这样的用户'。您不希望攻击者知道它是哪个,而实现这一目标的失败安全方法就是您不了解自己。只有数据库知道。
答案 2 :(得分:0)
这背后的想法是,如果您将密码作为原始数据存储在数据库中,那么比较
inputRawPassword.equals(dbRawpassword)
如果密码存储为hashed,那么对于原始密码,用户输入再次使用您在数据库中存储时用于散列的算法散列它,然后比较两个哈希值,即
hashInputPassword = hashFunction(intputRawPassowd);
hashInputPassword.equals(dbHashPassword)
希望它可以帮到你