MySQL 和 Java:检索时的字节数组与存储时的字节数组不同

MySQL and Java: Byte array not same when retrieved as it was when stored

我正在为用户创建一个 table,其中包含他们的散列密码和盐。

问题是,当我在 table 中创建用户行并保存 salt 和密码(两者都 byte[] 存储在 VARBINARY 列中)并尝试获取它时当用户重新登录时返回数据,返回的 salt 和散列密码与我创建行时不同。

为了获取数据,我正在使用 ResultSet 并调用 resultSet.getBytes("password")

为了创建行,我使用了这样的查询(删除了其他列数据以使其更简单):

String query = String.format("insert into users (`password`, `salt`) values ('%s','%s');", user.getHashedPassword(), user.getSalt());

是否有某种转换或正在发生的事情导致了这个问题?我应该使用 VARBINARY 以外的东西来存储 byte[] 吗?

Could there be some conversion or something that is happening that causes this problem?

是的。您基本上是在字节数组上调用 toString() 。那不会做你想要的。你看过你正在执行的 SQL 了吗?

除此之外,您无论如何都不应该生成这样的 SQL 字符串 - 这种方法容易受到 SQL Injection Attacks 以及转换问题的影响。

而是使用带有参数化 SQL 的 PreparedStatement,并直接指定参数值(PreparedStatement.setBytes 等)。

更广泛地说,最好不要推出自己的身份验证代码 - 寻找一个适合您正在使用的任何框架的现有库,这可能会避免任何自己动手时很容易造成许多安全漏洞。