Как добраться до содержимого бланка проверки подлинности с помощью PHP - PullRequest
1 голос
/ 25 февраля 2009

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

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

  1. Сериализация имени пользователя, срока действия, других данных (которые мне безразличны). Создайте байтовый массив.
  2. Подпишите билет с использованием SHA1 (последние 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 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. Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 06 марта 2009

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

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

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

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

Это действительно все, что нужно сделать.

2 голосов
/ 25 февраля 2009

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

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

  • Вы уверены, что правильно расшифровали строку с правильным значением 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 также может предложить некоторую помощь.

1 голос
/ 18 августа 2010

Для всех, кто хочет сделать это, обратите внимание, что шифрование 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" ).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...