0

我正在尝试比较来自 Web 服务的 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;
}

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

谢谢!

4

2 回答 2

3

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

于 2012-09-04T18:03:12.590 回答
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;

}
于 2012-09-04T18:45:14.093 回答