【问题标题】:Trying to store encrypted AES data into mySQL database using Java尝试使用 Java 将加密的 AES 数据存储到 mySQL 数据库中
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 2016-02-15
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多