2

同じ md5 ハッシュ パスワードが 2 つあり、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;
    }
4

2 に答える 2

5

を使用==しましたが、そのようなオブジェクトのString場合、オブジェクト参照を比較して、同じオブジェクトを参照しているかどうかを確認します。

値を比較するには、代わりStringに使用String#equalsします。

于 2013-05-08T23:41:49.517 に答える
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 のトリビアと言語の乱用です。

于 2013-05-09T01:01:09.003 に答える