No obtengo una coincidencia de sha1 en mi conversión de código C # a PHP, ¿qué me estoy perdiendo?
-
03-07-2019 - |
Pregunta
Estoy tratando de entender esto para poder hacer algo similar. Lo sé:
buf contiene una clave de autenticación con un hash agregado (los últimos 20 bytes) El HashData que se está buscando en MachineKeySection es 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;
}
}
Esto es lo que creo que está pasando: Estamos hash todos menos los últimos 20 bytes de buf. Entonces estamos, 1 byte a la vez, comparando el hash que acabamos de crear con el hash que se adjunta a los últimos 20 bytes de buf.
Así que en PHP estoy intentando esto:
//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);
Y el siguiente paso es comparar. Pero cuando hago eco de la salida de $ hash y sha1 ($ ticket) no coinciden, por lo que ni siquiera me he molestado en compararlos en el código.
Solución
De forma predeterminada, la función sha1 () de php devuelve un número hexadecimal de 40 caracteres. Tiene que solicitar explícitamente el formato binario de 20 bytes si eso es lo que quiere
$hash = sha1( $ticket, true );
Otros consejos
$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);