【发布时间】:2016-05-07 11:56:19
【问题描述】:
我正在尝试将一个字节数组存储到包含加密“密码”的 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;
}
我已打印出字节数组以查看是否存在差异,正如您在转换到数据库期间看到的那样,它确实发生了变化,我不知道如何解决这个问题
字节数组的输出(上为原始字节数组,下为数据库)
84-48-4282-15-60-21-38-41944477106182
916664495599545657505332
澄清一下,如果我尝试使用数据库字节数组解密,我会收到此错误:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decryption with padded cipher
同样如 cmets 部分所述,我尝试将其转换为字符串并将其存储在 DB 中,然后对其进行解密,但我得到了同样的错误。
我什至尝试过使用带有 SHA-256 的散列,这与我正在检索的字节数组与原来的完全不同
我正在使用的变量
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");
【问题讨论】:
-
是存储此值的列的 DB 数据类型
VARCHAR? -
没有 atm 我正在使用 varbinary,我也尝试过 blob 但同样的问题
-
您可以尝试使用
VARCHAR。将值作为字符串存储在 DB 中,然后在从 DB 中读取后相应地对其进行解析。有意义吗? -
我试过了,甚至解析 ISO-8859-1 格式的字节/字符串,可惜没有用
-
您永远不应该加密您的用户密码。您需要使用散列代替一些强大的散列,例如 PBKDF2、bcrypt、scrypt 和 Argon2。由于散列函数是单向函数,因此您将无法“解密”散列。为了验证您的用户,您可以再次通过哈希函数运行密码,以便与存储在数据库中的哈希值进行比较。查看更多:How to securely hash passwords?
标签: java mysql encryption