Ne pas obtenir une correspondance sha1 dans ma conversion de code C # vers PHP, que me manque-t-il?
-
03-07-2019 - |
Question
J'essaie de comprendre cela pour pouvoir faire quelque chose de similaire. Je sais:
buf contient une clé d'authentification avec un hachage ajouté (les 20 derniers octets) Le HashData qui est recherché dans la MachineKeySection est 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;
}
}
Voici ce que je pense qui se passe: Nous hachaisons tout sauf les 20 derniers octets de buf. Ensuite, nous comparons, un octet à la fois, le hachage que nous venons de créer au hachage ajouté aux 20 derniers octets de buf.
Donc, en PHP, j'essaie ceci:
//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);
Et l'étape suivante consiste à comparer. Mais quand je fais écho à la sortie de $ hash et sha1 ($ ticket), ils ne correspondent pas, donc je ne me suis même pas soucié de les comparer dans le code.
La solution
Par défaut, la fonction sha1 () de php renvoie un nombre hexadécimal de 40 caractères. Vous devez demander explicitement le format binaire 20 octets si vous le souhaitez
$hash = sha1( $ticket, true );
Autres conseils
$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);