我有一个想在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中编写此查询以满足'如果它在那里而不是它不在那里?
问候。
答案 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
*/