2017-11-28 4 views
0

Hier ist, was ich von meinem Servlet nichtWie Hash und Salzen eines Kennworts in mysql-Datenbank mit einem 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)"); 

Die Werte für den Benutzernamen und das Passwort gespeichert werden korrekt auf dem Server aber das Passwort haben. Es wird als der folgende SHA2 (CONCAT ('edf', 733903552), 256) für die gegebenen Werte gespeichert.

Ich gehe davon aus, dass die SHA2- und CONCAT-Funktion keine Wirkung zeigen, seit einiger Zeit damit herumspielen und nicht herausfinden können warum.

Antwort

0

Es wird ein String-Literal übergeben, und das wird gespeichert. Bedenken Sie:

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

Der Wert foo ist das, was in als Wert in der SQL-Anweisung übergeben wird.

MySQL sieht keinen Inhalt dieser Zeichenfolge als SQL-Text ... es ist nur eine Zeichenfolge. (Dies ist das Verhalten, das wir wollen. Einer der großen Vorteile von Prepared Statements und binden Platzhalter verhindert SQL-Injection, das heißt, zu verhindern Werte aus als Teil des SQL interpretiert.)

Wenn Sie die CONCAT wollen und SHA2 Funktionen, die als MySQL-Funktionen ausgeführt werden, müssen diese Teil des SQL-Textes sein. Pass (als Werte) nur password1 und salt.

Etwas wie folgt aus:

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); 
Verwandte Themen