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