尝试使用Java将加密的AES数据存储到mySQL数据库中

时间:2016-01-29 16:46:56

标签: java mysql encryption

我试图将一个字节数组存储到包含加密密码的mySQL中。我尝试过同时使用Blob和varbinary数据类型,但是当我提取加密数据时,它似乎无法正确解密,因为存储的字节数组与我开始时的字节数组不同。

以下加密/解密代码

   public byte[] encrypt(String password){
    byte[] encrypted = null;
    try {
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        encrypted = cipher.doFinal(password.getBytes());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return encrypted;
}

public String decrypt(byte[] encrypted){
    String decrypted = null;
    try {
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        decrypted = new String(cipher.doFinal(encrypted));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return decrypted;
}

我打印出字节数组以查看是否存在差异,正如您在转换到数据库期间所看到的那样,它确实发生了变化,我不知道如何克服这个问题

字节数组的输出(Top是原始字节数组,bottom是来自数据库)

84-48-4282-15-60-21-38-41944477106182
916664495599545657505332

只是为了澄清,如果我尝试使用数据库字节数组解密,我会收到此错误:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decryption with padded cipher

同样如评论部分所述,我已经尝试将其转换为字符串并将其存储在数据库中然后解密它,但我得到了同样的错误。

我甚至尝试过使用SHA-256的Hashing,我检索的字节数组与原来的字节数组完全不同

我使用

的变量
byte[] pa = p.hashPass("Hello World");
byte[] dbp = null;

这是我用来存储/获取数据的声明

Statement stmt = conn.createStatement();
stmt.execute("INSERT INTO staffaccounts(`ID`, `UserName`, `Password`, `Salt`) VALUES (NULL, 'admin', '"+pa+"', '')");
ResultSet rs = stmt.executeQuery("SELECT * FROM staffaccounts");
rs.next();
dbp = rs.getBytes("password");

1 个答案:

答案 0 :(得分:1)

这里的问题是你要插入byte[].toString()返回的值,不是字节数组的内容。

您应该通过PreparedStatement. 从不将值连接到SQL语句中的位置参数来执行此操作。