【问题标题】:How to get at contents of Forms Authentication ticket with PHP如何使用 PHP 获取表单身份验证票的内容
【发布时间】:2009-02-25 19:27:51
【问题描述】:

我需要撤消 PHP 中的以下 ASP.Net 进程,以便我可以获取票证中的用户名和到期日期。我已经解密了 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 BD B5 5B 0A 66 9B DD E7 DC 7B 78 F4 F8

它没有映射到 ascii,接下来我该怎么做?我有 SHA1 验证密钥。感谢您的帮助!

【问题讨论】:

    标签: php .net forms-authentication


    【解决方案1】:

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

    几个先决问题:

    • 您确定使用正确的MachineKey 值和解密算法正确解密了字符串吗?我知道 ASP.NET 1.0 使用 3DES,但较新的版本通常默认使用 AES。
    • 为什么首先要访问这些数据? FormsAuthenticationTicket 并非旨在“破坏”,如果您打算从不同的语言访问这些值,您可以考虑推出自己的方案。

    一些值得注意的观察结果:

    Buried 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 也可以提供一些帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      3. 最后我得到了一个带有 20 字节 SHA1 哈希的字符串。最后 20 个字节(应该)匹配字符串第一部分的 SHA1 哈希(字符串长度 - 20 个字节)。我仍在研究这部分,试图弄清楚 .NET 如何将字节数组转换为可以进行 SHA1 哈希处理的单个数据块(所以我可以在 PHP 端做同样的事情)。

      这就是它的全部内容。

      【讨论】:

      • 那么如何从解密的数据中获取用户名?
      【解决方案3】:

      对于其他想要这样做的人,请注意 ASP.NET 使用的 AES 加密始终为 16 字节块大小,即 PHP mcrypt 术语中的 MCRYPT_RIJNDAEL_128,并使用 CBC 模式。密钥长度(ASP.NET 默认为 32 字节/256 位)由 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多