【问题标题】:AES_ENCRYPT and AES_DECRYPT using javaAES_ENCRYPT 和 AES_DECRYPT 使用 java
【发布时间】:2015-01-14 08:31:31
【问题描述】:

我有带有字段 id、name 和 sal 的表 mm

我使用 AES_ENCRYPT 在数据库中插入了加密值

psmt = con.prepareStatement("insert into mm values("+id+",AES_ENCRYPT('"+name+"','"+key+"'),AES_ENCRYPT('"+sal+"','"+key+"'))");

工作正常

但是当我尝试使用 AES_DECRYPT 检索这些值时

rs = st.executeQuery("select id,AES_DECRYPT(name,'"+key+"'),AES_DECRYPT(sal,'"+key+"') FROM mm WHERE id="+rs.getInt(1)+"");

当我在 mysql 控制台上应用查询时,它可以正常工作。

但是当使用 java 代码应用时,它会给出类似

的值
| 1| [B@1f0690a| [B@803365 |

为什么我得到这些值而不是原始值?

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    字节数组上的toString() 不会返回字节数组的内容,而是返回[B@ 后跟字节数组的标识哈希码。在您的插入中,您没有使用key 的内容作为键,而是使用toString-值。您需要使用带有参数化查询的PreparedStatement,并使用setBytes 设置值:

    psmt = con.prepareStatement("insert into mm values (?, AES_ENCRYPT(?, ?), AES_ENCRYPT(?, ?))");
    psmt.setInt(1, id);
    psmt.setString(2, name);
    psmt.setBytes(3, key);
    psmt.setstring(4, sal);
    psmt.setBytes(5, key);
    

    对您的选择查询执行相同的操作。

    您不应该将值连接到您的查询中。它会让你容易受到 SQL 注入的攻击。

    【讨论】:

      【解决方案2】:

      更改您的流程顺序。

      首先,从表格中选择您的值。

      From your eg. --> | 1| [B@1f0690a| [B@803365 |
      

      其次,使用 AES_DECRYPT 解密这两列。

      【讨论】:

      • 但是 AES_DECRYPT 仅适用于 mysql 控制台我如何在 java 中解密
      • 如果是这样,我同意@Mark Rotteveel 的回答,即使用带有参数查询的 psmt!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2011-06-20
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多