来自MessageDigest的Java中的md5哈希不匹配

时间:2012-04-01 00:57:00

标签: java md5

我有一个名为users的对象,用于存储具有凭据信息的用户对象。

我将此代码称为新的默认用户。

user def = new user("admin","admin",md5hash(("osa").toCharArray()),1,-1);

此def用户已添加到阵列中。

这些用户存储在数组中。当我遍历数组以检查它是否有效时,我使用这段代码输出有关数组内用户的信息,即字节数组中字符串格式的用户名和密码。

System.out.println(userarray.get(x).username);
System.out.println((userarray.get(x).password).toString());

密码全部用md5加密,并使用以下代码存储为字节数组:

byte[] md5hash(char[] passwd) {
    String passwdtext = new String(passwd);
byte[] passdigest = null;
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.reset();
        md5.update(passwdtext.getBytes("UTF-8"));
        passdigest = md5.digest();

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return passdigest;
}

当我尝试为用户输入“admin”而输入“osa”作为密码时,我也输出这些并将它们与数组中的值进行比较

我得到以下内容:

admin [B@2b12e7f7

并与数组中的值进行比较:     admin [B @ 663b1f38

为什么他们不同?

2 个答案:

答案 0 :(得分:2)

toString()字节数组不对数据进行编码。您正在查看的是所述阵列的内存地址。 “[B”表示字节数组。之后的十六进制是地址。

相反,您应该调用Arrays.toString(digestArray);,它将打印数组中的实际值。

此外,您发布的代码并不清楚,但如果您尝试使用==来比较两个数组,则会因同样的原因而失败。数组上的==运算符比较内存地址。同样,您应该使用Arrays.equals(a1, a2)进行比较。

答案 1 :(得分:1)

您正在toString()拨打byte[],只是致电Object.toString()。你得到的并不代表数组的内容,而是代表 hashCode

如果您想获取MD5字符串,我建议您使用Apache DigestUtils.md5Hex()项目中的Commons Codec。这取代了您的整个md5hash()方法。

如果您不热衷于添加外部依赖项并且只想自己实现,那么您只需要为字节数组中的每个字节值解码一个String表示,例如Arrays.toString()