Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字节[]数据在使用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 - Fatal编程技术网

字节[]数据在使用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 ..."'"