比较两个消化的md5字符串返回false

时间:2013-05-08 23:40:34

标签: java jsp servlets

我有两个md5哈希密码是相同的,应该使用MessageDigest.isEqual方法返回true。但是比较返回false。

使用Array.toString打印字节数组时,它们是相同的。对于Arrays.euqals和MessageDigest.isEqual,它仍然不起作用。

public boolean verifyUserCredentials(String username, MessageDigest password) {

        ListIterator<User> iterator = userList.listIterator();
        while (iterator.hasNext()) {
            User user = iterator.next();
            byte md1[] = user.getPassword().digest();
            byte md2[] = password.digest();
            if (user.getUsername() == username && MessageDigest.isEqual(md1, md2)) {
                return true;
            } 
        }
        return false;
    }

2 个答案:

答案 0 :(得分:5)

您使用过==,但对于像String这样的对象,它会比较对象引用以查看它们是否引用同一个对象。

要比较String值,请改用String#equals

答案 1 :(得分:0)

或者你可以采取邪恶的方法和滥用字符串实习:

user.getUsername().intern() == username.intern()

打印以下代码:

String s1 = "asdf";
String s2 = "as"; // break this into two parts to keep the compiler from 
s2 = s2 + "df";   // automatically interning the constant and having the strings
                  // be the same. 

System.out.println( s1 == s2 ? "true" : "false");
System.out.println( s1.intern() == s2.intern() ? "true" : "false");

输出:

false
true

需要+“df”以防止编译器自动实现常量字符串。

注意:这比我建议你实际做的更多是Java琐事和语言滥用。