来自Web服务的相同字符串的Java md5哈希对于每个事务都是不同的

时间:2012-09-04 17:59:57

标签: java web-services md5

我正在尝试比较来自网络服务的java中的密码。

我使用以下命令从命令行调用服务:

curl -d'[{“usr”:“joe”,“password”:“joe”}]'http://mydomain.com:8080/myservice/login

我解析JSON并将密码传递给哈希方法。

我的散列方法如下:

 private String createHash(String password){

    byte[] bytesOfMessage = null;
    try {
        bytesOfMessage = password.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");

    } catch (NoSuchAlgorithmException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    String thedigest = md.digest(bytesOfMessage).toString();
    System.out.println("passed in: "+thedigest);

    return thedigest;
}

问题是,每次使用完全相同的密码调用此方法时,打印的哈希值都不同。如何让密码以相同的哈希值出现,以便我可以比较密码并验证用户身份?

谢谢!

2 个答案:

答案 0 :(得分:3)

digest()方法返回byte[],而toString()上的byte[]方法正在打印字节的对象标识数组,而不是内容。通常,为了打印出byte []的结果,您需要将字节转换为可打印的字符串(通常使用十六进制编码或base64编码)。十六进制编码经常用于md5校验和example here

答案 1 :(得分:0)

您可以尝试使用base64。我已经给出了示例

public String encrypt(String plaintext) throws Exception {

        MessageDigest messageDigest = null;
        String hash=null;

        try{
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(plaintext.getBytes("UTF8"));
            byte[] raw = messageDigest.digest();
            hash = new String(Base64.encode(raw));


        }catch(Exception nsa){
        throw new Exception();
        }

            return hash;

}