2010-02-26 8 views
7

Ich versuche jemand das Passwort zu überprüfen, wenn Sie sich anmelden.2 gleich byte [] kehrt nicht wahr

ich das eingegebene Passwort nehmen und rufen die Nutzer Salz Hash-Passwort und das Passwort gespeichert.

Dann Hash ich das eingegebene Passwort mit dem gespeicherten Salz um zu sehen, ob es gleich dem gespeicherten Passwort ist.

Obwohl das byte [] storedPassword genau wie das byte [] incutedPassword ist, gibt es in einem bool nicht true zurück und überprüft daher den Benutzer nicht. Warum das?

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, byte[] storedSalt) 
    { 
     byte[] password = CreateHashedPassword(newPassword, storedSalt); 

     if (!password.Equals(storedPassword)) 
      return false; 

     return true; 
    } 

Antwort

3

Gleich ist nicht Byte vergleichen die zwei Byte [] Arrays. Sie müssen jedes Byte in den beiden Arrays selbst vergleichen.

2

Sie müssen über die Elemente eines Arrays iterieren, um zu sehen, ob sie identisch sind. Mit der Methode .Equals() können Sie nur feststellen, ob zwei Variablen auf dasselbe Array verweisen.

 for (int i = 0; i < password.Length; i++) 
      if (password[i] != storedPassword[i]) 
       return false; 
     return true; 
+0

Vor diesem Code, würde ich die Länge des Passworts und storedPassword vergleichen. Wenn storedPassword kleiner als das Passwort ist, können Sie nach dem Ende des Arrays lesen. Auf der anderen Seite, wenn das Passwort kürzer ist, vergleicht es nur die ersten paar Bytes. Wenn Sie ein kürzeres Passwort erhalten, könnte es möglich sein, mit einem Präfix des gespeicherten Passworts übereinzustimmen. Jacob – TheJacobTaylor

+0

Im Allgemeinen erzeugen Passwort-Hash-Algorithmen immer die Ausgabe der gleichen Anzahl von Bytes. Zum Beispiel ist ein MD5-Hash immer 16 Byte, so dass die Länge der Hashes nicht überprüft werden muss. – Gabe

13

Sie sollten jedes Byte Ihrer Arrays vergleichen, können Sie eine einfache Schleife machen, oder die SequenceEqual Linq Extension-Methode, sofern diese verfügbar:

public static bool VerifyPassword(byte[] newPassword, byte[] storedPassword, 
            byte[] storedSalt) 
{ 
    byte[] password = CreateHashedPassword(newPassword, storedSalt); 

    return password.SequenceEqual(storedPassword); 
} 
0

Die System.Array.Equals Methode zu testen erscheint nur für die Objektidentität, genau wie object.Equals.

Sie müssen eine Schleife schreiben und die Elemente selbst vergleichen.

0

Array.Equals ist wie Objekt.Equals, es testet zum Beispiel Gleichheit, nicht für "Wert" Gleichheit.

Sie brauchen so etwas wie:

public static boolean ByteArrayEquals(byte[] a, byte[] b) { 
    if (a.Length != b.Length) 
    return false; 
    for (int i = 0; i < a.Length; i++) 
    { 
     if (a[i] != b[i]) 
     return false; 
    } 
    return true; 
} 
Verwandte Themen