我有一个名为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
为什么他们不同?
答案 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()
。