谢谢你的期待。我在获取数据库和连接以匹配密码时遇到问题。 MySQL和我的java md5s是相同的,但当我检查它在比较中是否相等时,它说它们不一样。我不确定我在这里做错了什么。
例如,以下是两者的生成MD5: MySQL:798da231909aa3645eced61dde9f9bfa Java:798da231909aa3645eced61dde9f9bfa
所以,我不确定为什么当我检查时他们不会平等。
import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.*;
/**
* Created by Ohlaph on 8/29/2015.
*/
public class Conn {
private Connection con = null;
private String JDBC = "com.mysql.jdbc.Driver";
private String username = "root", password = "password";
private Statement statement;
private ResultSet rs;
private String user_name, user_password;
private String dbname = "jdbc:mysql://localhost/thon";
public Conn(String user, String password) {
this.user_name = user;
this.user_password = MD5(password);
}
public void Connect() throws Exception {
try {
Class.forName(JDBC);
con = DriverManager.getConnection("jdbc:mysql://localhost/thon", username, password);
statement = con.createStatement();
} catch (Exception e) {
System.out.println(e);
System.out.println("Failure");
}
}//end CONNECT()
public boolean checkIt() throws Exception {
String check = "select * from users";
try {
rs = statement.executeQuery(check);
while (rs.next()) {
String usr = rs.getString("nickname");
String pwd = rs.getString("password");
System.out.println("user name " + usr + ", Password " + pwd);
if (user_name.equals(usr) && user_password.equals(pwd)) {
System.out.println("Access Granted");
return true;
} else {
System.out.println("Access Denied");
return false;
}
}
} catch (Exception e) {
System.out.println("Error " + e);
}
con.close();
return false;
}//end checkIt()
public static String MD5( String source ) {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
byte[] bytes = md.digest( source.getBytes("UTF-8") );
return getString( bytes );
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}//end MD5()
private static String getString( byte[] bytes ) {
StringBuffer sb = new StringBuffer();
for( int i=0; i<bytes.length; i++ )
{
byte b = bytes[ i ];
String hex = Integer.toHexString((int) 0x00FF & b);
if (hex.length() == 1)
{
sb.append("0");
}
sb.append( hex );
}
return sb.toString();
}// end getString()
}//end Conn.java
答案 0 :(得分:0)
行user_password = MD5(user_password);
里面 while
循环,所以它将MD5表示第一个用户记录的值,然后MD5表示第二个用户已经MD5的值记录,等等,这样当你遇到有问题的用户时,你的价值就会非常严重。
也许在构造函数中执行MD5会更好。
不相关,但不是每次都查询整个用户表,而应该使用以下内容:
String sql = "select password from users where nickname = ?";
并使用PreparedStatement
设置标记值(?
)。
<强>更新强>
您的错误是您在循环中执行System.out.println("Access Denied"); return false;
,因此循环永远不会查看第二条记录。
将where nickname = ?
添加到SQL将有助于解决这个问题,因为只返回一条记录(假设nickname
是唯一的),但循环逻辑仍然存在缺陷。