使用java的AES_ENCRYPT和AES_DECRYPT

时间:2015-01-14 08:31:32

标签: java mysql jdbc

我有表mm,字段ID,名称和sal

我使用AES_ENCRYPT

在DB中插入了加密值
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 |

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

2 个答案:

答案 0 :(得分:2)

字节数组上的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注入的攻击。<​​/ p>

答案 1 :(得分:0)

更改您的流程顺序。

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

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

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