如何使用PHP获取Forms身份验证票证的内容

时间:2009-02-25 19:27:52

标签: php .net forms-authentication

我需要在PHP中撤消以下ASP.Net进程,以便我可以获取故障单中的用户名和到期日期。我已经解密了3DES加密(下面的步骤3),但我不确定接下来我需要做什么。解密产生的字符串是字节数组吗?我应该能够将其转换为ascii吗? (因为它没有)。

ASP.Net用什么来创建票证:

  1. 序列化用户名,过期日期,其他数据(我不关心)。创建一个字节数组。
  2. 使用SHA1签署票证(sig是最后20个字节)
  3. 使用3DES加密票证(我未加密)。
  4. 我找回了这样的东西:

      

    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验证密钥。谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

我认为这不可能......

一些先决条件问题:

  • 您确定已使用正确的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等),除非你知道隐藏在这种原生方法中的微软实现,否则你不会得到数据。

MSDN也可以提供一些帮助。

答案 1 :(得分:2)

我一直在努力,我已经设法在PHP中获取表单身份验证票证内容。

  1. 使用用于在.Net端加密的相同密钥解密故障单。为此,我正在使用http://www.navioo.com/php/docs/function.mcrypt-encrypt.php

  2. 解密会在字符串末尾添加填充,我将其删除。

  3. 我留下了一个字符串,末尾有一个20字节的SHA1哈希值。最后20个字节(应该)匹配字符串第一部分的SHA1哈希值(字符串长度 - 20个字节)。我还在研究这一部分,试图弄清楚.NET如何将字节数组转换成可以被SHA1散列的单个数据块(所以我可以在PHP端做同样的事情)。

  4. 这就是它的全部内容。

答案 2 :(得分:1)

对于其他想要执行此操作的人,请注意ASP.NET使用的AES加密始终为16字节块大小,即PHP mcrypt术语中的MCRYPT_RIJNDAEL_128,并使用CBC模式。密钥长度(默认情况下为32字节/ 256位)由PHP根据提供的实际密钥确定。此外,解密数据的开头似乎已损坏,除非IV全为零(即“\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 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