字节[]数据在使用Java保存到SQL后发生更改 public void saveNewAccount(字符串名称、字符串用户名、字节[]pas、字节[]salt){ 试一试{ Class.forName(myUrl); c=DriverManager.getConnection(myDriver); c、 设置自动提交(错误); stmt=c.createStatement(); System.out.println(Arrays.toString(pas)+“保存前”); String sql=“插入帐户(名称、用户名、密码、密码)”+ “值(“+name+”、“+username+”、“+pas+”、“+salt+”);”; stmt.executeUpdate(sql); stmt.close(); c、 提交(); c、 close(); }捕获(例外e){ System.err.println(e.getClass().getName()+“:”+e.getMessage()); 系统出口(0); } } 公共列表getAccountPas(字符串用户名){ 列表acc=null; 试一试{ acc=新的ArrayList(); Class.forName(myUrl); c=DriverManager.getConnection(myDriver); c、 设置自动提交(错误); stmt=c.createStatement(); ResultSet rs=stmt.executeQuery(“从帐户中选择*,其中(用户名=”+“用户名+”);”; while(rs.next()){ acc.add(rs.getBytes(“PASSWORDSALT”); acc.add(rs.getBytes(“密码”); System.out.println(Arrays.toString(acc.get(0))+“salt sql”); System.out.println(Arrays.toString(acc.get(1))+“来自sql的pas”); } stmt.close(); c、 提交(); c、 close(); }捕获(例外e){ System.err.println(e.getClass().getName()+“:”+e.getMessage()); 系统出口(0); } 返回acc; }
所以我这里有个问题。 从数据库中获取密码后,它与我保存的版本不同。 但盐还是一样。 我花了今天的时间想弄明白,但我找不到解决办法。字节[]数据在使用Java保存到SQL后发生更改 public void saveNewAccount(字符串名称、字符串用户名、字节[]pas、字节[]salt){ 试一试{ Class.forName(myUrl); c=DriverManager.getConnection(myDriver); c、 设置自动提交(错误); stmt=c.createStatement(); System.out.println(Arrays.toString(pas)+“保存前”); String sql=“插入帐户(名称、用户名、密码、密码)”+ “值(“+name+”、“+username+”、“+pas+”、“+salt+”);”; stmt.executeUpdate(sql); stmt.close(); c、 提交(); c、 close(); }捕获(例外e){ System.err.println(e.getClass().getName()+“:”+e.getMessage()); 系统出口(0); } } 公共列表getAccountPas(字符串用户名){ 列表acc=null; 试一试{ acc=新的ArrayList(); Class.forName(myUrl); c=DriverManager.getConnection(myDriver); c、 设置自动提交(错误); stmt=c.createStatement(); ResultSet rs=stmt.executeQuery(“从帐户中选择*,其中(用户名=”+“用户名+”);”; while(rs.next()){ acc.add(rs.getBytes(“PASSWORDSALT”); acc.add(rs.getBytes(“密码”); System.out.println(Arrays.toString(acc.get(0))+“salt sql”); System.out.println(Arrays.toString(acc.get(1))+“来自sql的pas”); } stmt.close(); c、 提交(); c、 close(); }捕获(例外e){ System.err.println(e.getClass().getName()+“:”+e.getMessage()); 系统出口(0); } 返回acc; },java,sql,encryption,byte,Java,Sql,Encryption,Byte,所以我这里有个问题。 从数据库中获取密码后,它与我保存的版本不同。 但盐还是一样。 我花了今天的时间想弄明白,但我找不到解决办法。 感谢所有愿意帮助的人。:) 我注意到你有一个分号更多最后,在两个查询中,尝试按如下方式删除它们: public void saveNewAccount(String name, String username, byte[] pas, byte [] salt) { try { Class.forName(myUrl); c
感谢所有愿意帮助的人。:) 我注意到你有一个分号
代码>更多最后,在两个查询中,尝试按如下方式删除它们:
public void saveNewAccount(String name, String username, byte[] pas, byte [] salt) {
try {
Class.forName(myUrl);
c = DriverManager.getConnection(myDriver);
c.setAutoCommit(false);
stmt = c.createStatement();
System.out.println(Arrays.toString(pas)+ "before save");
String sql = "INSERT INTO accounts (NAME, USERNAME, PASSWORD, PASSWORDSALT) " +
"VALUES ('"+name+"','"+username+"','"+pas+"','"+salt+"');";
stmt.executeUpdate(sql);
stmt.close();
c.commit();
c.close();
} catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
public List<byte[]> getAccountPas(String username) {
List<byte[]> acc = null;
try {
acc = new ArrayList<>();
Class.forName(myUrl);
c = DriverManager.getConnection(myDriver);
c.setAutoCommit(false);
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM accounts WHERE (USERNAME='"+username+"');");
while (rs.next()) {
acc.add(rs.getBytes("PASSWORDSALT"));
acc.add(rs.getBytes("PASSWORD"));
System.out.println(Arrays.toString(acc.get(0))+ "salt sql");
System.out.println(Arrays.toString(acc.get(1)) + "pas from sql");
}
stmt.close();
c.commit();
c.close();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
return acc;
}
不要使用字符串连接来使用外部源(例如用户)的值构建SQL语句。如果值包含”
,SQL语句将失败并出现语法错误,或者更糟糕的是,该代码只是要求使用进行黑客攻击,从而允许黑客窃取您的数据和/或删除您的表
至于您看到的问题,数据库当然不包含您试图保存的值。像pas
和salt
这样的字节数组与字符串连接时类似:
[B@659e0bfd
因此,您的SQL是:
插入帐户(名称、用户名、密码、密码)
价值观('John Doe','jdoe','[B@2a139a55','[B@659e0bfd');
上述两个问题(SQL注入和字节数组)的解决方案是相同的:使用PreparedStatement
注意:删除SQL语句末尾的无关的;
。不要用;
结束SQL语句。为了更好地处理资源清理,还更改为使用try with resources
public void saveNewAccount(字符串名称、字符串用户名、字节[]pas、字节[]salt){
try(连接c=DriverManager.getConnection(“”){
c、 设置自动提交(错误);
String sql=“插入帐户(名称、用户名、密码、密码)”+
“值(?,?,?)”;
try(PreparedStatement stmt=c.prepareStatement(sql)){
stmt.setString(1,名称);
stmt.setString(2,用户名);
stmt.setBytes(3,pas);
stmt.setBytes(4,盐);
stmt.executeUpdate();
c、 提交();
}捕获(例外e){
c、 回滚();
投掷e;
}
}捕获(例外e){
System.err.println(e.getClass().getName()+“:”+e.getMessage());
系统出口(0);
}
}
另外,不要通过串接字符串来构造sql查询。这是一个安全漏洞,您会遇到引用问题,这可能就是您的情况。请使用参数化查询/准备好的语句。我注意到您在两个查询的结尾都有一个分号;
,请尝试按如下方式删除它们:“插入到…”“选择*从…”“您应该将其添加为注释。非常感谢您的回答!非常感谢您的回答!
"INSERT INTO...."'"
"SELECT * FROM ..."'"