用Java中的MD5哈希?

时间:2016-05-22 17:56:22

标签: java hash cryptography md5

我正在创建一个程序,它将获取用户输入的登录名和密码并散列此变量(登录名和密码)。

当我从登录哈希输出时它可以工作但是当我尝试哈希时,密码的输出不起作用。

代码:

String login;
String password;


login = JOptionPane.showInputDialog("Login : ");
password = JOptionPane.showInputDialog("Password : ");

MessageDigest m; 


try 
{ 
m = MessageDigest.getInstance("MD5");
m.update(login.getBytes(),0,login.length()); 
m.update(password.getBytes(),0,password.length());
BigInteger login1 = new BigInteger(1, m.digest()); 
BigInteger password1 = new BigInteger(1, m.digest());

login = String.format("%1$032X", login1); 
password = String.format("%1$032X", password1); 

JOptionPane.showMessageDialog(null,"Login : " + login + 
                "\nPassword : " + password);

//System.out.println("login : "+ login); 
//System.out.println("password : " + password);
} 

输出

login : E9CA9D798BA364DFF16C738D03AF6668
password : D41D8CD98F00B204E9800998ECF8427E

变量登录正常,但是在散列时密码总是做同样的结果,我想让变量密码在散列时总是得到一些不同的结果。

PS:抱歉英语不好,不是我的母语。

2 个答案:

答案 0 :(得分:2)

正如评论中指出的那样,您在没有重置的情况下两次调用摘要。您需要在下次使用前重置摘要。

try
{
    m = MessageDigest.getInstance("MD5");
    m.update(login.getBytes(), 0, login.length());
    BigInteger login1 = new BigInteger(1, m.digest());
    login = String.format("%1$032X", login1);

    m.reset(); // <---- Reset before doing the password
    m.update(password.getBytes(), 0, password.length());
    BigInteger password1 = new BigInteger(1, m.digest());
    password = String.format("%1$032X", password1);

    System.out.println(login);
    System.out.println(password);
}

答案 1 :(得分:0)

我猜您是从Web元素检索密码而不是直接提取字符串进行散列。 D41D8CD98F00B204E9800998ECF8427E是&#34;没有&#34;的md5sum。 (零长度的字符流)。通常在html(html5)中,密码字段足够智能,不会泄露数据,这可能就是为什么你得到一个空字符串作为回报。希望这有帮助