Не получается совпадения sha1 при преобразовании кода C# в PHP, что мне не хватает?

StackOverflow https://stackoverflow.com/questions/607017

Вопрос

Я пытаюсь понять это, чтобы сделать что-то подобное.Я знаю:

BUF содержит ключ аутентификации с хэш, добавленным к нему (последние 20 байтов), хэшдат, которые смотрят в машине, - это 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;
    }
}

Вот что, я думаю, происходит:Мы хешируем все buf, кроме последних 20 байт.Затем мы по одному байту сравниваем только что созданный хэш с хешем, который добавляется к последним 20 байтам buf.

Итак, в PHP я пробую это:

//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);

И следующий шаг – сравнение.Но когда я повторяю вывод $hash и sha1($ticket), они не совпадают, поэтому я даже не удосужился сравнить их в коде.

Это было полезно?

Решение

По умолчанию php функция sha1() возвращает 40-значное шестнадцатеричное число.Вы должны явно запросить 20-байтовый двоичный формат, если вы этого хотите.

$hash = sha1( $ticket, true );

Другие советы

$ticket = substr($decrypthex, 0, -20);
$hash = substr($decrypthex, -20);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top