Как преобразовать код C# для создания ключа авторизации в PHP - PullRequest
1 голос
/ 13 апреля 2020

У меня есть код для генерации ключа авторизации в C#, который выглядит следующим образом:

    public string generateToken()
    {
        byte[] time = BitConverter.GetBytes(DateTime.UtcNow.ToBinary());
        byte[] key = Guid.NewGuid().ToByteArray();
        string token = Convert.ToBase64String(time.Concat(key).ToArray());

        return token;
    }

Ключ аутентификации выглядит следующим образом: 21VMky3f10ik7t5IeGKCSrA+MO10rN2N И код для его декодирования выглядит так:

    public bool decodeToken(string token)
    {
        byte[] data = Convert.FromBase64String(token);
        DateTime when = DateTime.FromBinary(BitConverter.ToInt64(data, 0));
        if (when < DateTime.UtcNow.AddHours(-24))
        {
            //token is more than 24 hours old
            return false;
        } else
        {
            return true;
        }
    }

Как мне перевести функцию decodeToken в функцию PHP, чтобы я мог проверить токен на сервере.

Мой текущий код PHP выглядит следующим образом:

$decoded = base64_decode($token);
$rawBytes = "";
foreach(str_split($decoded) as $byte)
{
    $rawBytes .= ' ' . sprintf("%08b", ord($byte));
}

$new = unpack("q",$rawBytes);

$time = ticks_to_time($new[1]);
return date("F j Y g:i:s A T", $time);

$ new [1] = 3544386994072269088, который затем превращается в дату и время:

September 18 11232 6:16:47 PM UTC

Это неверно, и я не знаю, как это исправить

Спасибо!

1 Ответ

0 голосов
/ 21 апреля 2020

Значение Int64 может быть определено непосредственно после base64_decode с распаковкой. int64 - это 64-разрядное целое число со знаком, которое кодирует свойство Kind в 2-разрядное поле, а свойство Ticks - в 62-разрядное поле. Клещи должны быть отфильтрованы с помощью маски. Тики затем конвертируются в отметку времени linux.

$token = "21VMky3f10ik7t5IeGKCSrA+MO10rN2N";

$decoded = base64_decode($token);

$decArr = unpack("q",$decoded);
$int64 = $decArr[1]; //5248909277561378267 = 2 bit kind and 62 bit ticks

$ticks = ($int64 & 0x3fffffffffffffff);

$linuxTs = $ticks/10000000 - 62135596800;

echo gmdate("Y-m-d H:i:s",$linuxTs);
//2020-04-12 22:05:13
...