从Java在MySql中存储用户名/密码

时间:2013-06-09 20:50:26

标签: java mysql

我正在为Java GUI创建一个注册和登录页面,其中将在GUI中创建用户名和密码,然后将其存储在MySQL表中。相关代码是 -

    passL = new JPasswordField();
    userNameT = new JTextField();

    //Set up everything else


    submitB = new JButton("click to submit");
    frame.add(submitB);
    submitB.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = GetConnection.getConnectionInstance();
                PreparedStatement statement1 = con
                        .prepareStatement("INSERT INTO users (username, password) VALUES ("
                                + Integer.parseInt(userNameT.getText())
                                + ",SHA1('" + passT.getPassword() + "'))");
                statement1.executeUpdate();
            } //Catches exceptions etc

userNameT是一个数字,密码(passT)可以是任何东西(还没有编写约束)。

我的问题是Eclipse在getPassword上给我一个警告 - “必须显式地将char []转换为String”。我这样做是否存在安全问题?

此外,我还需要在复制后将passT显式更改为null或空白,否则Java会自动执行此操作。

欢迎所有建议!感谢

2 个答案:

答案 0 :(得分:0)

问题是类型不匹配:“ getPassword ”会返回需要转换为字符串 char [] 才能连接在你的查询中。

Java会在不再使用的情况下处理垃圾收集您的对象,即不在任何地方引用,因此您不必担心。

也许唯一可以采取的安全措施是清除“ getPassword ”返回的数组

答案 1 :(得分:0)

使用PreparedStatement的一个要点是防范SQL injection,但是你使用它的方式仍然让你很脆弱。相反,您应该考虑在Java中进行散列并设置如下的参数值:

String sql = "INSERT INTO users (username, password) VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setInt(1, Integer.parseInt(userNameT.getText()));
stmt.setString(2, DigestUtils.sha1Hex(String.valueOf(userPassT.getPassword())));