看起来我在这句话中遗漏了一些东西。在进入DB之前尝试加密密码。并且,使用以下字符串。
String Sql = "INSERT INTO virtual_users"
+"(domain_id, password, email) VALUES"
+"(?,ENCRYPT(?, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),?)";
以上ENCRYPT有什么问题吗?
完整代码以供参考。
public void AddMail(MailUsers mAC) {
String Sql = "INSERT INTO virtual_users"
+"(domain_id, password, email) VALUES"
+"(?,ENCRYPT(?, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),?)";
PreparedStatement ps = null;
try {
ps = DBUtils.getPreparedStatement(Sql);
ps.setInt(1, mAC.getDomain_id());
ps.setString(2, mAC.getPassword());
ps.setString(3, mAC.getEmail());
System.out.println(ps);
ps.executeUpdate();
} catch (ClassNotFoundException | SQLException ex) {
Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
System.out.println(ps);
}
}
错误
com.mysql.jdbc.JDBC42PreparedStatement@1c9aab0a:INSERT INTO virtual_users(domain_id,密码,电子邮件)VALUES(1,ENCRYPT('asdfasdf', CONCAT('$ 6 $',SUBSTRING(SHA(RAND()), - 16))),'tink@in.in')严重: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 列'密码'不能为零
答案 0 :(得分:2)
这里的问题是您正在调用函数ENCRYPT,该函数使用本机* NIX cript()
方法来加密数据。如果您在Windows机器中不存在此类本机功能,则在文档中明确说明:
如果您的系统上没有crypt()(如Windows的情况),ENCRYPT()始终返回NULL。
因此,传递给ENCRYPT
函数的任何内容都将计算为NULL,因此您在评论中提到错误:
信息:com.mysql.jdbc.JDBC42PreparedStatement@1c9aab0a:INSERT INTO virtual_users(domain_id,password,email)VALUES(1,ENCRYPT('asdfasdf',CONCAT('$ 6 $',SUBSTRING(SHA(RAND()) ,-16))),'tink@in.in')严重:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列'密码'不能为空
由于密码字段中有一个Not Null约束,因此会抛出错误。
尝试使用MySQL中的其他可用加密功能之一,并特别注意Docs
中的建议或者为您的Dev环境设置一个简单的哈希函数,例如MD5('yourpass')
。甚至抛弃MySql函数并使用Java方法来执行此操作。看一下这个主题:How do I generate a SALT in Java for Salted-Hash?