2016-04-23 82 views
1

我忙於登錄JFrame,系統將要求用戶輸入用戶名和密碼。密碼使用SHA-1散列並存儲在MySQLSHA1不會爲相同的字符串輸入生成相同的散列值?

我遇到的問題是,對於完全相同的密碼字符串,輸出不一致。 我需要一個使用SHA1的散列,它會產生相同的輸出,以便我可以根據數據庫中的散列驗證它,以證明用戶輸入了正確的密碼。

這是我編寫的sha1。

try 
     { 
      String password = txtPassword.getPassword().toString(); 

      MessageDigest md = MessageDigest.getInstance("SHA-1"); 
      md.update(password.getBytes()); 

      byte byteData[] = md.digest(); 

      //convert the byte to hex format 
      StringBuffer sb = new StringBuffer(); 
      for (int i = 0; i < byteData.length; i++) { 
      sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); 
      } 

      System.out.println("Hex format : " + sb.toString()); 


     } 
     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(this, e); 
     } 

上面的代碼是否存在問題,會導致它對同一個字符串產生不同的輸出。

+0

'MessageDigest.getInstance(「SHA-1」);'? – noahnu

+0

'「MD5」'聽起來不會給你帶來SHA-1 ... –

+0

謝謝,正確。對不起,我正在嘗試許多不同的哈希算法。 – John

回答

1
String password = txtPassword.getPassword().toString(); 

這是什麼代碼?這很可能是問題所在,因爲設置password =「test」會重複給你相同的結果。

編輯:

嘗試這種情況:字符串密碼=新字符串(txtPassword.getPassword());

+1

感謝您的回覆。該行的原因是獲取用戶輸入的密碼。密碼將從JPasswordField調用並存儲在變量密碼中。系統將需要爲該密碼創建一個散列值,如果散列值與MySQL中的散列值相匹配,則用戶將被認證。 – John

+1

你不想讓它成爲一個字符串,這就是getPassword返回char []而不是字符串的原因。要處理您想使用字符的密碼,然後清零數組。 [注](https://docs.oracle.com/javase/8/docs/api/javax/swing/JPasswordField.html#getText--) –

1

我一直在嘗試不同的編碼,我發現問題是從JPasswordField獲取密碼。

我來解決其產生相同的散列的口令是一條線,我不得不從String password = txtPassword.getPassword().toString();編輯這個String password = String.valueOf(txtPassword.getText());

我意識到問題出在閱讀它作爲一個字符串而不是一個值。

感謝您的回覆

相關問題