Nicht immer ein SHA1-Spiel in meiner C # PHP-Code-Konvertierung, was bin ich dabei?
-
03-07-2019 - |
Frage
Ich versuche, dies zu verstehen, so kann ich etwas Ähnliches tun. Ich weiß:
buf enthält einen Authentifizierungsschlüssel mit einem Hash angehängt (die letzten 20 Bytes) Die HashData, die in der MachineKeySection nachgeschlagen Sein ist SHA1
length -= 20;
byte[] buffer2 = MachineKeySection.HashData(buf, null, 0, length);
for (int i = 0; i < 20; i++)
{
if (buffer2[i] != buf[length + i])
{
return null;
}
}
Hier ist, was ich denke, geschieht: Wir sind Hashing alle bis auf die letzten 20 Bytes von buf. Dann sind wir, 1 Byte zu einem Zeitpunkt, den Hash vergleichen wir nur mit dem Hash erstellt, die auf den letzten 20 Bytes von buf angehängt wird.
So in PHP Ich versuche dies:
//get the length of the ticket -20 bytes
$ticketLn = strlen($buf)-40;
//grab all but the last 20 bytes
$ticket = substr($decrypthex, 0, $ticketLn);
//create a hash of the ticket
$hash = substr($decrypthex, $ticketLn);
Und der nächste Schritt ist, zu vergleichen. Aber wenn ich die Ausgabe von $ hash und SHA1-Echo ($ Ticket) sie nicht überein, so habe ich nicht einmal die Mühe gemacht, sie in Code zu vergleichen.
Lösung
In der Standardeinstellung PHP SHA1 () Funktion eine hexadezimale Zahl 40 Zeichen zurückgibt. Sie haben explizit die 20-Byte-Binär-Format zu verlangen, wenn das, was Sie wollen
$hash = sha1( $ticket, true );
Andere Tipps
$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);