Non ricevo una corrispondenza sha1 nella conversione del mio codice C # in PHP, cosa mi sto perdendo?
-
03-07-2019 - |
Domanda
Sto cercando di capirlo in modo da poter fare qualcosa di simile. Lo so:
buf contiene una chiave di autenticazione con un hash aggiunto (gli ultimi 20 byte) L'HashData che viene cercato in MachineKeySection è 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;
}
}
Ecco cosa penso stia accadendo: Stiamo cancellando tutto tranne gli ultimi 20 byte di buf. Quindi, 1 byte alla volta, confrontiamo l'hash che abbiamo appena creato con l'hash che viene aggiunto agli ultimi 20 byte di buf.
Quindi in PHP sto provando questo:
//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);
E il prossimo passo è il confronto. Ma quando ecto l'output di $ hash e sha1 ($ ticket) non corrispondono, quindi non mi sono nemmeno preoccupato di confrontarli nel codice.
Soluzione
Per impostazione predefinita, la sha1 () funzione di php di php restituisce un numero esadecimale di 40 caratteri. Devi richiedere esplicitamente il formato binario a 20 byte se è quello che vuoi
$hash = sha1( $ticket, true );
Altri suggerimenti
$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);