我为包含散列密码及其盐的用户创建了一个表格。
问题在于,当我在表格中创建用户的行并保存盐和密码(两者都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[]
吗?
答案 0 :(得分:1)
是否会出现一些导致此问题的转换或正在发生的事情?
是。你基本上是在字节数组上调用toString()
。这不会做你想要的。你看过你正在执行的SQL吗?
不仅如此,你不应该生成这样的SQL字符串 - 这是一种易受SQL Injection Attacks和转换问题影响的方法。
相反,使用带参数化SQL的PreparedStatement
,并直接指定参数值(PreparedStatement.setBytes
等)。
更广泛地说,最好不要自己编写自己的身份验证代码 - 寻找适合您正在使用的任何框架的现有库,这可能会避免任何众多的安全性这些漏洞在你自己创建时很容易创建。