在Java中生成相同的MD5哈希

时间:2012-03-28 16:09:04

标签: java md5

尝试创建安全登录我已决定使用以下代码创建MD5哈希,从How can I generate an MD5 hash?改编了一小部分

但是,当在登录页面上创建用户时,这不会生成相同的哈希。为什么这是因为我认为散列对每个字符串都是唯一的。

    MessageDigest messageDigest = null;

    try{
        messageDigest = MessageDigest.getInstance("MD5");
    }catch(NoSuchAlgorithmException e){
        System.out.println("Error: " + e);
    }

    messageDigest.reset();
    messageDigest.update(inPassword.getBytes());
    byte[] digest = messageDigest.digest();
    BigInteger bigInt = new BigInteger(1, digest);
    String encodedPass = bigInt.toString(16);

    while (encodedPass.length() < 32) {
        encodedPass = "0" + encodedPass;
    }


    inPassword = encodedPass;

3 个答案:

答案 0 :(得分:2)

这至少是问题的部分

messageDigest.update(inPassword.getBytes());

使用平台默认编码将密码转换为字节。这可能会因您运行它的每个系统而异。我强烈建议你指定一个编码 - 理想情况下是一个能处理所有Unicode字符的编码(例如UTF-8)。

你可能还想考虑腌制,使用比MD5更好的东西,而且我不确定你从byte[]转换为十六进制 - 它可能可以,但是我找到了一个只使用BigInteger完成整个事情的库。

答案 1 :(得分:0)

以下是您可能需要的完整代码。

import java.io.FileInputStream;
import java.security.MessageDigest;

public class MD5CheckSumExample 
{
    public static void main(String[] args)throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("MD5");
        FileInputStream fis = new FileInputStream("c:\\loging.log");

        byte[] dataBytes = new byte[1024];

        int nread = 0; 
        while ((nread = fis.read(dataBytes)) != -1) {
          md.update(dataBytes, 0, nread);
        };
        byte[] mdbytes = md.digest();

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

        System.out.println("Digest(in hex format):: " + sb.toString());

        //convert the byte to hex format method 2
        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<mdbytes.length;i++) {
            String hex=Integer.toHexString(0xff & mdbytes[i]);
            if(hex.length()==1) hexString.append('0');
            hexString.append(hex);
        }
        System.out.println("Digest(in hex format):: " + hexString.toString());
    }
}

答案 2 :(得分:0)

试试这个,它对我有用:

messageDigest.update(myString.getBytes(), 0, myString.length());

你的其余代码似乎是正确的。希望能帮助到你! :)