我正在为用户创建一个包含其哈希密码的表,这很麻烦。
问题是,当我在表中创建用户的行并保存盐和密码(都byte[]
存储在VARBINARY
列中)并尝试在用户重新登录时取回数据时,返回的盐和哈希密码与其不同是我创建该行的时间。
要获取我正在使用的数据,ResultSet
然后致电resultSet.getBytes("password")
要创建行,我使用类似这样的查询(删除了其他列数据以使其更简单):
String query = String.format("insert into users (`password`, `salt`) values ('%s','%s');", user.getHashedPassword(), user.getSalt());
可能发生某些转换或正在发生的事情导致此问题?除了VARBINARY
存储以外,我还应该使用其他东西byte[]
吗?
可能发生某些转换或正在发生的事情导致此问题?
是的。您基本上是在调用toString()
字节数组。那不会做你想要的。您是否查看了正在执行的SQL?
更重要的是,您无论如何都不应该生成这样的SQL字符串-这种方法容易受到SQL注入攻击以及转换问题的影响。
而是使用PreparedStatement
带参数化SQL的,并直接指定参数值(PreparedStatement.setBytes
等)。
更广泛地说,最好不要完全使用自己的身份验证代码-寻找一个与您正在使用的框架相适应的现有库,这很可能避免它所带来的众多安全漏洞。自己动手做起来太容易了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句