Java准备语句ENCRYPT

时间:2018-03-27 05:14:57

标签: java mysql

看起来我在这句话中遗漏了一些东西。在进入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:   列'密码'不能为零

1 个答案:

答案 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?