Java MessageDigest don';对决
我有一个名为users的对象,用于存储具有凭据信息的用户对象 我调用此代码来创建一个新的默认用户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
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的,这就是问题所在。谢谢。