1

我需要撤消 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 37 BD B5 5 0A 66 9B DD E7 直流 7B 78 F4 F8

它不映射到ascii,接下来我该怎么办?我有 SHA1 验证密钥。谢谢你的帮助!

4

3 回答 3

2

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

几个前置问题:

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

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

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

于 2009-02-25T20:48:36.817 回答
2

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

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

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

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

这就是它的全部。

于 2009-03-06T13:27:13.340 回答
1

对于其他想要这样做的人,请注意 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

于 2010-08-18T13:10:48.430 回答