Как получить содержимое билета аутентификации с помощью форм с помощью PHP

Мне нужно отменить следующие процессы ASP.Net в PHP, чтобы я мог получить имя пользователя и дату истечения срока действия в билете. Я расшифровал шифрование 3DES (шаг 3 ниже), но не знаю, что мне делать дальше. Является ли строка, полученная в результате расшифровки, массивом байтов? Должен ли я быть в состоянии преобразовать его в ascii? (Потому что это не так).

Что ASP.Net делает для создания билета:

  1. Сериализовать имя пользователя, срок действия, другие данные (которые меня не волнуют). Создайте массив байтов.
  2. Подпишите билет, используя SHA1 (sig — последние 20 байтов)
  3. Зашифруйте билет с помощью 3DES (который я расшифровал).

Я возвращаю что-то похожее на это:

6E 85 A4 39 71 31 46 BB A3 F6 BE 1A 07 EE A4 CE 5F 03 C8 D1 4C 97 5D 6A 52 D1 C4 82 75 5E 53 06 7B 1D D2 4D BF 22 40 F7 F4 B8 8D B0 C3 EC E5 BE F7 52 C2 DF 00 7A D1 CB BC 76 4B 10 33 2D 1A B4 15 A7 BB D6 9D BF 41 69 D2 C4 43 4A 26 95 01 F2 06 AA 46 2C 96 CC AD DC 08 59 C0 64 B6 EE 2C 5F CA ED 8B 92 1C 80 FD FF DC 61 67 28 59 CB E6 71 C6 C3 72 0E D0 32 69 22 57 4E 40 2B DA 67 BA 7F F1 C5 78 BC DF 80 8C D8 F2 8B 19 E2 A4 4F 7C 8C D9 97 37 BD B5 5B 0A 66 9B DD E7 DC 7B 78 F4 F8

Он не отображается в ascii, что мне делать дальше? У меня есть ключ проверки SHA1. Спасибо за любую помощь!


person lynn    schedule 25.02.2009    source источник


Ответы (3)


Я не думаю, что это возможно...

Несколько предварительных вопросов:

  • Вы уверены, что правильно расшифровали строку, используя правильное значение MachineKey и алгоритм расшифровки? Я знаю, что ASP.NET 1.0 использовал 3DES, но более новые версии обычно используют AES по умолчанию.
  • Почему вы обращаетесь к этим данным в первую очередь? FormsAuthenticationTicket не предназначался для «сломанного», и если вы собираетесь получить доступ к этим значениям с другого языка, вы можете рассмотреть возможность создания собственной схемы.

Некоторые заслуживающие внимания наблюдения:

Похороненный in FormsAuthentication.Decrypt() — это призыв к UnsafeNativeMethods.CookieAuthParseTicket(...). Вот подпись:

[DllImport("webengine.dll", CharSet=CharSet.Unicode)]
internal static extern int CookieAuthParseTicket(byte[] pData, int iDataLen, StringBuilder szName, int iNameLen, StringBuilder szData, int iUserDataLen, StringBuilder szPath, int iPathLen, byte[] pBytes, long[] pDates);

Это анализирует то, что выглядит как массив байтов, возвращенный из MachineKeySection.HexStringToByteArray() (очевидно, функция, которая декодирует строку с использованием UTF-8) в отдельные элементы FormsAuthenticationTicket.

Я могу только предположить, что независимо от того, какой метод декодирования вы используете (ASCII, UTF-16 и т. д.), вы не получите данные обратно, если не знаете, что реализация Microsoft скрыта в этом родном методе.

MSDN также может помочь.

person John Rasch    schedule 25.02.2009

Я работал над этим, и мне удалось получить содержимое билета проверки подлинности форм в PHP.

  1. Расшифруйте билет тем же ключом, который использовался для его шифрования на стороне .Net. Для этого я использую http://www.navioo.com/php/docs/function.mcrypt-encrypt.php.

  2. Расшифровка добавляет заполнение в конец строки, я удаляю это.

  3. У меня осталась строка с 20-байтовым хешем SHA1 в конце. Эти последние 20 байтов (должны) соответствовать хэшу SHA1 первой части строки (длина строки — 20 байт). Я все еще работаю над этой частью, пытаясь понять, как .NET преобразует массив байтов в один блок данных, который можно хэшировать SHA1 (так что я могу сделать то же самое на стороне PHP).

Вот и все.

person lynn    schedule 06.03.2009
comment
И как вы получаете имя пользователя из расшифрованных данных? - person Tarnschaf; 15.07.2011

Для всех, кто хочет это сделать, обратите внимание, что шифрование AES, используемое ASP.NET, всегда имеет размер блока 16 байт, то есть MCRYPT_RIJNDAEL_128 в терминологии PHP mcrypt, и использует режим CBC. Длина ключа (32 байта / 256 бит по умолчанию в ASP.NET) определяется PHP на основе фактического предоставленного ключа. Кроме того, начало расшифрованных данных кажется поврежденным, если только IV не состоит из нулей (например, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ 0\0").

Дополнительные сведения о расшифровке данных см. по адресу: http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspx

person OttoG    schedule 18.08.2010