Java MessageDigest don';对决

Java MessageDigest don';对决,java,md5,Java,Md5,我有一个名为users的对象,用于存储具有凭据信息的用户对象 我调用此代码来创建一个新的默认用户 user def = new user("admin","admin",md5hash(("osa").toCharArray()),1,-1); 此def用户将添加到阵列中 这些用户存储在一个数组中。当我在数组中循环检查它是否有效时,我使用这段代码来输出数组中用户的信息,即字节数组中字符串格式的用户名和密码 System.out.println(userarray.get(x).username

我有一个名为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
并与数组中的值进行比较: 管理员[B@663b1f38

为什么它们不同?

toString()字节数组不编码数据。您看到的是所述数组的内存地址。“[B”表示字节数组。后面的十六进制表示地址

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


另外,您发布的代码也不清楚,但是如果您试图使用
=
来比较这两个数组,同样的原因也会失败。数组上的
=
操作符比较内存地址。这里,您应该再次使用
数组。equals(a1,a2)
进行比较。

您正在调用
toString()
在刚刚调用的
字节[]
上。您得到的不是数组的内容,而是它的哈希代码

如果您希望获得一个MD5字符串,我建议您从Apache项目中使用。这将替换整个
md5hash()
方法


如果您不喜欢添加外部依赖项,只想自己实现它,那么您只需要解码字节数组中每个字节值的字符串表示,例如by。

osa的正确MD5校验和是十六进制的,
43f38d003c06cca6687b5991a52787c1
。我不清楚您是怎么做到的正在尝试输出MD5。您是否正在尝试以ASCII格式输出小写的十六进制数字?如果您认真想存储密码,您至少应该使用随机salt进行散列。或者使用bcrypt.True,但这是针对学校项目xD.Yup的,这就是问题所在。谢谢。