2016-04-23 76 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());

我意识到问题出在阅读它作为一个字符串而不是一个值。

感谢您的回复

相关问题