java - 尝试通过JDBC在MySQL中存储SecretKey、加密密码

标签 java mysql database encryption jdbc

我正在尝试创建自己的小程序来娱乐,它允许用户创建用户名/密码,然后使用 AES 对其进行加密,然后将用户名、加密密码和 key 存储在 MySQL 数据库中。我 future 的计划是允许用户通过从数据库检索此信息并解密以根据数据库检查登录信息来“登录”。

目前,我已经在 J​​ava 中使用了所有加密/解密功能。我已经使用各种输入对其进行了测试,并且我知道这些方法都可以正常工作。我遇到的问题涉及将此信息存储在 MySQL 数据库中。我能够很好地连接到数据库并执行 SELECT 查询,但是当我使用 INSERT 语句存储信息时,出现错误。

这是我的 MySQL 数据库的设置:

mysql> SHOW COLUMNS FROM Accounts;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(45) | NO   | UNI | NULL    |                |
| password | blob        | NO   |     | NULL    |                |
| key      | blob        | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

这是有问题的代码:

public static void main(String[] args) throws Exception {

    String plainText = "test"; 
    SecretKey secKey = getSecretEncryptionKey(); // working correctly
    byte[] cipherText = encryptText(plainText, secKey); // working correctly
    String decryptedText = decryptText(cipherText, secKey); // working correctly
    byte[] secKey2 = secKey.getEncoded(); // necessary??

    try{  
        Class.forName("com.mysql.jdbc.Driver"); 
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test?useSSL=false","****","****");  // user/pass commented out
        Statement stmt = con.createStatement();  
        ResultSet rs = stmt.executeQuery("use Test;");  
        stmt = con.createStatement(); 
        stmt.executeUpdate("INSERT INTO Accounts (username, password, key) VALUES ('test1', '"+cipherText+"', '"+secKey2+"');");
        con.close();
    } catch(Exception e){ 
        System.out.println(e);
    }  

}

我得到的错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key) VALUES ('test1', '[B@735b478', '[B@2c9f9fb0')' at line 1

我在数据库中使用的模式称为“测试”。 “use Test”查询似乎确实有效。

在上面的示例中,“test1”将是用户名,cipherText 将是哈希密码,secKey2 将是编码到字节数组中的 key 。

我尝试过将 key 转换为字节数组或不将 key 转换为字节数组,因为我读到最好将 key 转换为字节数组并存储为 blob。我还尝试过将“密码”和“ key ”字段设置为 VARCHAR。我没有包含加密/解密的方法,因为我知道它们可以正常工作,问题是将信息存储在数据库中。

任何帮助将不胜感激!

最佳答案

@Jose_Ferrer 的答案完全正确地指出了代码的一些问题(例如:您存储的是字节数组的地址,而不是计算出的哈希值)。

但是,您遇到的语法错误消息与此没有直接关系:您最终会在数据库中存储无用的字符串,但这不是数据库可以提示的事情。

语法错误似乎是由于使用“key”保留字作为表的字段造成的。 SQL 解析器提示在需要字段名称的地方找不到关键字(键)。

关于java - 尝试通过JDBC在MySQL中存储SecretKey、加密密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41272118/

相关文章:

mysql - 主表可以与另一个主表有关系吗?

java - 使用mockito进行接口(interface)实现

SQL 连接两个表的列

java - 列名称中包含 "é"的 iSeries JDBC Sql 语句抛出 java.sql.SQLException : [SQL0104]

PHP 日历在新 div 中包含过期日期

mysql - 使用 C 在 Eclipse 中退出值 - 它们是什么意思?

MySQL:使用(选择?)表中的结果进行批量更新的最快方法

ios - 使用预填充的 Parse 数据存储发送 iOS 应用程序

java - 如何修复我的 java.lang.NullPointerException (android)?

Java 附加 API