单引号的java中的SQL查询

时间:2014-06-17 13:39:56

标签: java sql

我有一个想在java中运行的查询:

SELECT md5(CONCAT(md5('{clear password}') , '{salt}'));

我的应用程序连接并使用与我的论坛相同的用户名/密码。

它的工作,但当salt包含字符'时,它会出错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

我如何在java中编写此查询以满足'如果它在那里而不是它不在那里?

问候。

2 个答案:

答案 0 :(得分:3)

如果我关注你的问题,那么你可以用这样的东西来做 -

String sql = "select md5(CONCAT(md5(?), ?))";
PreparedStatement ps = null;
ResultSet rs = null;
try {
  ps = conn.prepareStatement(sql);
  ps.setString(1, password);
  ps.setString(2, pwdSalt);
  rs = ps.executeQuery();
} catch (SQLException e) {
  e.printStackTrace();
}

另一种可能的解决方案是在Java中执行hash和salt -

// A password hashing method.
public static String hashPassword(String in, String salt) {
  try {
    MessageDigest md = MessageDigest.getInstance("MD5"); // <-- Or, SHA-256
    md.update(salt.getBytes());        // <-- Prepend salt.
    md.update(in.getBytes());
    // md.update(salt.getBytes());     // <-- Or, append salt.

    byte[] out = md.digest();
    return bytesToHex(out);            // <-- Return the Hex Hash.
  } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
  }
  return "";
}

private static String bytesToHex(byte[] byteArr) {  
  StringBuilder sb = new StringBuilder();   
  Formatter fmt = new Formatter(sb);  
  for (byte b : byteArr) {  
    fmt.format("%02x", b);  
  }  
  return sb.toString();
}  

最后,我不会在2014年使用MD5.SHA-256将是我的首选。

答案 1 :(得分:1)

准备好的查询示例:

/*
 * Some code
 */
String strSQL = "select md5(concat(md5(?),?))"
try(PreparedStatement ps = conn.prepareStatement(strSQL)) {
    ps.setString(1, password);
    ps.setString(2, pwdSalt);
    try(ResultSet rs = ps.executeQuery()) {
        rs.first();
        // Do whatever you need to do
    } catch(SQLException e) {
        // ...
    }
} catch(SQLException e) {
    // ...
}

/*
 * More code
 */