Java准备语句加密

Java准备语句加密,java,mysql,Java,Mysql,看来我在这份声明中遗漏了什么。在密码进入数据库之前尝试加密密码。并且,使用以下字符串 String Sql = "INSERT INTO virtual_users" +"(domain_id, password, email) VALUES" +"(?,ENCRYPT(?, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),?)"; 上面的加密有什么问题吗 完整的代码供参考。 public vo

看来我在这份声明中遗漏了什么。在密码进入数据库之前尝试加密密码。并且,使用以下字符串

String Sql = "INSERT INTO virtual_users"
               +"(domain_id, password, email) VALUES"
               +"(?,ENCRYPT(?, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))),?)";
上面的加密有什么问题吗

完整的代码供参考。

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:插入 虚拟用户(域id、密码、电子邮件)值(1,ENCRYPT('asdfasdf'), CONCAT('6$',子字符串(SHA(RAND(),-16)),'tink@in.in“)严重: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: “密码”列不能为nul


这里的问题是,您正在调用一个使用本机*NIX
script()
方法加密数据的函数。如果您使用的是windows计算机,则此类本机功能不存在,请在文档中明确说明:

如果crypt()在您的系统上不可用(如Windows),则ENCRYPT()始终返回NULL

因此,您传递到
ENCRYPT
函数的任何内容都将计算为NULL,因此您在注释中提到的错误:

信息:com.mysql.jdbc。JDBC42PreparedStatement@1c9aab0a:在虚拟用户(域id、密码、电子邮件)中插入值(1,加密('asdfasdf',CONCAT('$6$',子字符串(SHA(RAND(),-16)),'tink@in.in“)严重:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:列“password”不能为null

由于密码字段中有NOTNULL约束,因此会引发错误

尝试在MySQL中使用其他可用的加密函数之一,并特别注意


或者为您的开发环境设置一个简单的散列函数,例如
MD5('yourpass')
。或者甚至放弃MySql函数,使用Java方法来实现。看看这个帖子:

你有没有收到任何错误消息?是的,上面写着。。信息:com.mysql.jdbc。JDBC42PreparedStatement@1c9aab0a:在虚拟用户(域id、密码、电子邮件)中插入值(1,加密('asdfasdf',CONCAT('$6$',子字符串(SHA(RAND(),-16)),'tink@in.in')严重:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Column'password'不能为空您是否在windows计算机上运行此操作?是的,在开发环境中,它是windows。但是,在生产中,它将在Ubuntu上运行。谢谢!这就是问题所在。在Windows上,MD5可以完美地工作。此外,该文件还提到了Nix(加密)。。很公平!