AES_ENCRYPT 和 AES_DECRYPT 使用 java
AES_ENCRYPT and AES_DECRYPT using java
我有 table mm 字段 id,name 和 sal
我使用 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 |
为什么我得到这些值而不是原始值?
更改处理顺序。
首先,select 您的值来自 table。
From your eg. --> | 1| [B@1f0690a| [B@803365 |
其次,使用AES_DECRYPT解密这两列。
字节数组上的 toString()
不是 return 字节数组的内容,而是 [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);
并为您的 select 查询执行相同的操作。
永远不要将值连接到查询中。它会让你容易受到 SQL 注入。
我有 table mm 字段 id,name 和 sal
我使用 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 |
为什么我得到这些值而不是原始值?
更改处理顺序。
首先,select 您的值来自 table。
From your eg. --> | 1| [B@1f0690a| [B@803365 |
其次,使用AES_DECRYPT解密这两列。
字节数组上的 toString()
不是 return 字节数组的内容,而是 [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);
并为您的 select 查询执行相同的操作。
永远不要将值连接到查询中。它会让你容易受到 SQL 注入。