如何使用servlet将密码哈希并加密到mysql数据库?

时间:2017-11-28 17:49:04

标签: mysql servlets model-view-controller

以下是我的servlet中的内容

Random random = new Random();
String salt = Integer.toString(random.nextInt(1000000000 - 1 + 1) + 1);

String sql = "insert into users (user_name, salt, password) "
                + "values (?, ?, ?)";

        c = DriverManager.getConnection( url, username, password );
        PreparedStatement pstmt = c.prepareStatement( sql );
        pstmt.setString( 1, userName );
        pstmt.setString( 2, salt);
        pstmt.setString( 3, "SHA2(CONCAT('" +password1+ "', "+ salt +"), 256)");

用户名和密码的值正确存储在服务器上,但密码不是。对于给定的值,它存储为以下SHA2(CONCAT(' edf',733903552),256)。

我假设SHA2和CONCAT功能没有生效,已经玩了一段时间并且无法找出原因。

1 个答案:

答案 0 :(得分:0)

传递了一个字符串文字,这就是存储的内容。考虑:

 String foo = "SHA2(CONCAT('" +password1+ "', "+ salt +"), 256)";
 pstmt.setString( 3, foo );

foo的值是在SQL语句中作为值在中传递的值。

MySQL没有将该字符串的任何内容视为SQL文本......它只是一个字符串。 (这是我们想要的行为。预准备语句和绑定占位符的一大好处是阻止SQL注入,即阻止被解释为SQL的一部分。)

如果您希望将CONCATSHA2函数作为MySQL函数执行,那么这些函数必须是SQL文本的一部分。仅传入({值})password1salt

这样的事情:

 String sql = "insert into users (user_name, salt, password)"
            + " values (?, ?, SHA2(CONCAT( ? , ? ),256) )";


 pstmt.setString( 1, userName );
 pstmt.setString( 2, salt );
 pstmt.setString( 3, password1 );
 pstmt.setString( 4, salt );