我试图将一个字节数组存储到包含加密密码的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");
答案 0 :(得分:1)
这里的问题是你要插入byte[].toString()
返回的值,不是字节数组的内容。
您应该通过PreparedStatement.
从不将值连接到SQL语句中的位置参数来执行此操作。