2015-10-18 143 views
-2

我正在使用mysql數據庫。如何從mysql數據庫驗證我的密碼字段中的密碼?

我的代碼工作時,我使用的名稱和ID從數據庫中進行驗證。 但是當我使用密碼進行驗證時,我不能因爲它被哈希/加密。 我想,如果從數據庫中的密碼相匹配的ID,然後在成功

我的驗證按鈕: 老師是我的表

try { 
     String url = "jdbc:mysql://localhost:3306/GradeSystem"; 
     String username = "root"; 
     String password = ""; 

     com.mysql.jdbc.Connection con = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, username, password); 
     Statement stmt = con.createStatement(); 

     String sql="SELECT * from TEACHER"; 

     ResultSet rs = stmt.executeQuery(sql); 
     String user=TID.getText();//variable name of my firsttxtfield 
     String pwd= new String (TPASS.getText());//variable name of my 2nd txtfield 
     int tmp=0; 
     while(rs.next()) { 
      String uname=rs.getString("TID");//TID name in my database 
      String pssword=rs.getString("TPASS"); //TID name in my database 
      if ((user.equals(uname)) && (pwd.equals(pssword))) 
      { 
       this.dispose(); 
       new TeacherAccount().setVisible(true); 

       tmp++; 

      } 
     } 
     if (tmp==0) { 
      JOptionPane.showMessageDialog(null, "Incorrect Password and Username!"); 
     } 
    } 
    catch (Exception e){ 
     JOptionPane.showMessageDialog(this, e.getMessage()); 
    }//i know my code is unclean im trying to implement first :) 

任何想法如何解決這個或任何其他外觀圖釋實施相同?對不起英文不好。

+0

你必須散列給出的密碼,然後比較它。 – ChiefTwoPencils

+0

我使用這個插入到mysql:Password.getText()和檢索Password.getText()=這個工程(ofc的密碼是可見的)。但我當我用來插入Password.getPassword,我不能使用Password.getPassword?如何獲取密碼? – Lonewulf

回答

1

整點是你不保存原始密碼。所以沒有辦法比較兩個不同的字符串是真的。所以,你需要像這個 -

if(encodedPassword.equals(encode(rawPassword))) { /* They passed */ }

這會比較與一個數據庫編碼的原始字符串。我建議你調查在db中插入密碼的代碼並使用相同的技術。

+0

謝謝你們兩位!!我現在用於插入的是存儲到我的數據庫THAN Password.getPassword的Password.getText(getText是刪除線)。因爲如果我使用密碼。getPassword存儲我不知道爲什麼我不能使用Password.getPassword檢索。這是我的代碼從數據庫中選擇String pwd = new String(TPASS.getText()); – Lonewulf

+0

@Tiny,我根據你的評論刪除了Spring引用。似乎不太清楚現在恕我直言。 – ChiefTwoPencils

+0

@SevyNnez,我不理解你。除非有什麼有趣的事情發生,否則我不確定'getPassword'會如何插入任何內容。你可以將整個代碼塊添加到你的文章中嗎? – ChiefTwoPencils

0

這背後的想法是,如果你是存儲密碼的數據庫原料則比較

inputRawPassword.equals(dbRawpassword) 

如果作爲哈希則原始口令作爲用戶輸入同樣具有相同的算法散列它的密碼存儲在該您使用的同時在數據庫中存儲散列,然後比較這兩個哈希值,即

hashInputPassword = hashFunction(intputRawPassowd); 
hashInputPassword.equals(dbHashPassword) 

希望它可以幫助你

1

你這樣做是不對的。根本不應該比較密碼。讓數據庫使用它的散列函數來執行它,它與存儲密碼時使用的相同。你感興趣的只是一件事而已:

  • 是否有用戶使用此用戶名和密碼?

所以你的SQL應該像

select count(*) from users where tid = ? and tpass = ? 

其中第二?可以通過F(?)一些˚F代替。

的原因是,你不想泄露,甚至對自己的應用程序,任何信息的影響,該用戶ID是錯誤的,或者它是正確的,但密碼是錯誤的。你所關心的只是'用戶存在'或'沒有這樣的用戶'。你不希望攻擊者知道它是哪一個,並且用自動防故障的方法來實現,那就是你自己不知道的地方。只有數據庫知道。

+0

我只是想提出這個建議。做得好! – andrewgu