我试着将密码安全地保存在我的数据库中。 我读过关于这个主题的内容,所有人都推荐使用salt并将其保存为密码。我把它放在mysql后,salt被改变了
于是我找出这个实现:
private static byte[] setSalt() throws NoSuchAlgorithmException {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
sr.nextBytes(salt);
return salt;
}
然后我试图将其保存为一个字节在MySQL
public static void test(byte[] salt) throws Exception{
SQLconnect sql = new SQLconnect();
Object[] prepString = {salt, "admin" };
sql.runQuery("UPDATE orhalimi_cl_db.users set Salt = ? where Username = ?",
prepString,ACTION.UPDATE);
}
这里是更新:
preparedStatement = connect.prepareStatement(query);
for (int i = 0; i < prepString.length; i++) {
preparedStatement.setObject(i + 1, prepString[i]);
}
preparedStatement.executeUpdate();
而且当我从DB中检索盐并检查equals
时,这些再见是不同的。
我在我的数据库中将salt保存为binary(16)
。
这里是我如何得到它从DB:
List<HashMap<String, Object>> results;
SQLconnect sql = new SQLconnect();
Object[] prepString = {"Salt", "admin" };
results = sql.runQuery("SELECT ? from orhalimi_cl_db.users where Username = ?",
prepString,ACTION.SELECT);
if (results.isEmpty()) {
System.out.println("empty");
return null;
}
return ((String) results.get(0).get("Salt")).getBytes();
我知道它的样子我已经给了很多不同部分的从我的代码, 但它看起来像我弄乱的字节保存或退出MySQL。所以我给了所有可能相关的信息。
在此先感谢。
答:
有趣的事情,我的问题是,我所有的SQL preparedStatement时使用?
,而不是只对价值的事实。所以它看起来像SELECT ? from orhalimi_cl_db.users who Username = ?
,转向SELECT 'Salt' from orhalimi_cl_db.users where Username = 'admin'
,答案总是盐。
无论如何,我将其转换为十六进制和Base64和容易得多,现在
尝试保存为blob。另外,在附注中,我认为你需要用你的密码来加密盐。 – anaxin
请提供'SHOW CREATE TABLE' –