【问题标题】:Java Prepared Statement ENCRYPTJava 准备好的语句 ENCRYPT
【发布时间】:2018-09-05 09:17:21
【问题描述】:

看起来我在这个声明中遗漏了一些东西。尝试在进入数据库之前加密密码。并且,使用以下字符串。

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:插入 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: 列“密码”不能为空

【问题讨论】:

  • 您是否收到任何错误消息?
  • 是的,它说.. 信息: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:列“密码”不能为空
  • 你是在windows机器上运行这个吗?
  • 是的,在 Dev 环境中,它是 Windows。但是,在生产中,它将在 Ubuntu 上运行。

标签: java mysql


【解决方案1】:

这里的问题是您正在调用一个函数ENCRYPT,它使用本机*NIX cript() 方法来加密数据。如果你在windows机器上不存在这样的本机功能,文档中明确说明:

如果 crypt() 在您的系统上不可用(如 Windows 的情况),ENCRYPT() 总是返回 NULL。

因此,您传递给ENCRYPT 函数的任何内容都将评估为 NULL,因此您在 cmets 中提到的错误:

信息: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 中的建议

或者为您的开发环境设置一个简单的哈希函数,例如MD5('yourpass')。甚至放弃 MySql 函数并使用 Java 方法来执行此操作。看看这个帖子:How do I generate a SALT in Java for Salted-Hash?

【讨论】:

  • 谢谢!这就是问题所在。在 MD5 完美运行的 Windows 上。此外,该文件还提到了 Nix(加密).. 很公平!
猜你喜欢
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多