2017-11-28 1 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 함수는 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); 
관련 문제