2017-11-28 16 views
0

は、私は、ユーザー名とパスワードの値は、サーバーに正しく保存されている私のサーブレットサーブレットを使ってmysqlデータベースにパスワードをハッシュして塩をかけるにはどうしたらいいですか?ここ

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機能が有効でないと仮定していますが、しばらくそれを試していて、理由を理解できません。

答えて

0

文字列リテラルが渡されており、それが保存されています。考えてみましょう:

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

fooの値は、SQL文で値ように渡されるものです。

MySQLは、その文字列の内容をSQLテキストとして表示しません。これは単なる文字列です。 (これは。準備文の大きな利点の一つ私たちが望む動作であり、プレースホルダをバインドするSQLの一部として解釈されるを防止すること、つまり、SQLインジェクションを妨げている。)

あなたがCONCATをしたい場合およびSHA2関数は、SQL関数の一部である必要があるMySQL関数として実行されます。ちょうど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); 
関連する問題