Java 试图通过JDBC在MySQL中存储加密密钥和密码

Java 试图通过JDBC在MySQL中存储加密密钥和密码,java,mysql,database,encryption,jdbc,Java,Mysql,Database,Encryption,Jdbc,我正在尝试创建自己的小程序,它允许用户创建用户名/密码,然后使用AES对其进行加密,然后将用户名、加密密码和密钥存储在MySQL数据库中。我未来的计划是允许用户“登录”,方法是从数据库中检索这些信息,并对其进行解密,以根据数据库检查登录信息 目前,我已经用Java实现了所有的加密/解密功能。我已经使用各种输入对其进行了测试,我知道这些方法都能正常工作。我遇到的问题涉及将这些信息存储在MySQL数据库中。我能够连接到数据库并很好地执行SELECT查询,但是当我使用INSERT语句存储信息时,会出现

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

目前,我已经用Java实现了所有的加密/解密功能。我已经使用各种输入对其进行了测试,我知道这些方法都能正常工作。我遇到的问题涉及将这些信息存储在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
我在数据库中使用的模式称为“Test”。“use Test”查询似乎确实有效

在上面的例子中,“test1”是用户名,密文是散列密码,secKey2是编码到字节数组中的密钥

我尝试过将密钥转换为字节数组和不转换为字节数组,因为我认为最好将密钥转换为字节数组并存储为blob。我也尝试过将“password”和“key”字段作为VARCHARs。我没有包括加密/解密的方法,因为我知道它们工作正常,问题是将信息存储在数据库中


任何帮助都将不胜感激

在根目录下,您试图将两字节数组存储到适当的列中。您看到的问题是由用于创建insert语句的字符串连接引起的。当你说

“在帐户(用户名、密码、密钥)中插入值('test1'、'“+cipherText+”、'“+secKey2+”)
你真正想说的是

“在帐户(用户名、密码、密钥)中插入值('test1','“+cipherText.toString()+”,“+secKey2.toString()+”)
那些[B@735b478及[B@2c9f9fb0值是(实际上)这些数组的指针地址,因为这是默认的
Object.toString()
实现

您不应该通过字符串连接来创建SQL语句。在向您开放的基础上,您将得到难以读取和维护的代码。使用instead of语句,这将允许您使用
setBlob()
方法。不确定如何从
字节[]中获取
Blob
不过。您也可以对
字节[]
进行Base64编码,并将其存储为varchar,但这完全是另一个主题


至于是否应在数据库中以任何可逆形式存储密码,请参见。

在根目录下,您正在尝试将两个字节数组存储到适当的列中。您看到的问题是由用于创建insert语句的字符串串联引起的

“在帐户(用户名、密码、密钥)中插入值('test1'、'“+cipherText+”、'“+secKey2+”)
你真正想说的是

“在帐户(用户名、密码、密钥)中插入值('test1','“+cipherText.toString()+”,“+secKey2.toString()+”)
那些[B@735b478及[B@2c9f9fb0值是(实际上)这些数组的指针地址,因为这是默认的
Object.toString()
实现

您不应该通过字符串连接来创建SQL语句。在向您开放的基础上,您将得到难以读取和维护的代码。使用instead of语句,这将允许您使用
setBlob()
方法。不确定如何从
字节[]中获取
Blob
不过。您也可以对
字节[]
进行Base64编码,并将其存储为varchar,但这完全是另一个主题


至于您是否应该在数据库中以任何可逆形式存储密码,请参见。

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

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


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

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

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


语法错误似乎是由于将“key”保留字用作表的字段。SQL解析器抱怨找不到关键字(key)需要字段名的地方。

您好,欢迎来到stackoverflow!您能为我们提供有关您所遇到错误的更具体信息吗?我所遇到的错误包含在Java代码的正下方。我使用的是Eclipse,这是我唯一看到的错误输出。您应该散列密码,而不是加密密码。您好,welcome to stackoverflow!你能给我们提供关于你得到的错误的更具体的信息吗?我得到的错误包含在Java代码下面。我使用Eclipse,这是我唯一看到的错误输出。你应该散列密码,而不是加密密码。我应该用“密码”来澄清我指的是经过哈希和盐渍处理的密码,而不是纯文本密码。一旦对纯文本进行哈希处理,它就会被丢弃。我应该用“pa”来澄清