MD5 java和mysql md5匹配并且外观相同但与.equals()不匹配

时间:2015-08-30 06:04:34

标签: java md5

谢谢你的期待。我在获取数据库和连接以匹配密码时遇到问题。 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

1 个答案:

答案 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是唯一的),但循环逻辑仍然存在缺陷。