如何使用 PHP 获取表单身份验证票证的内容
我需要在 PHP 中撤消以下 ASP.Net 进程,以便可以获取票证中的用户名和到期日期。 我已经解密了 3DES 加密(下面的步骤 3),但我不确定下一步需要做什么。 解密得到的字符串是字节数组吗? 我应该能够将其转换为ascii 吗? (因为事实并非如此)。
ASP.Net 创建票证的作用:
- 序列化用户名、过期时间和其他数据(我不关心这些)。 创建一个字节数组。
- 使用 SHA1 签署票证(sig 是最后 20 个字节)
- 使用 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 验证密钥。 谢谢你的帮助!
I need to undo the following ASP.Net processes in PHP so I can get at the username and expiration date in a ticket. I've decrypted the 3DES encryption (step 3 below) but I'm not sure what I need to do next. Is the string that results from decryption a byte array? Should I be able to convert it to ascii? (Because it doesn't).
What ASP.Net does to create ticket:
- Serialize username, expiration, other data (which I don't care about). Create a byte array.
- Sign the ticket using SHA1 (the sig is the last 20 bytes)
- Encrypt the ticket with 3DES (which I've unencrypted).
I get back something that looks like this:
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
It doesn't map to ascii, what do I do next? I have the SHA1 validation key. Thanks for any help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为这是不可能的...
一些先决问题:
MachineKey
值和解密算法正确解密了字符串吗? 我知道 ASP.NET 1.0 使用 3DES,但较新的版本通常默认使用 AES。FormsAuthenticationTicket
无意被“破坏”,如果您要从不同的语言访问这些值,您可以考虑推出自己的方案。一些值得注意的观察结果:
埋藏在 FormsAuthentication.Decrypt()
中的是对UnsafeNativeMethods.CookieAuthParseTicket(...)
的调用。 这是签名:它将看起来像是从
MachineKeySection.HexStringToByteArray()
返回的字节数组(显然是一个使用 UTF-8 解码字符串的函数)解析为的各个成员。代码>FormsAuthenticationTicket
。我只能假设,无论您使用哪种解码方法(ASCII、UTF-16 等),除非您知道隐藏在该本机方法中的 Microsoft 实现,否则您都无法取回数据。
MSDN 也可能提供一些帮助。
I don't think this is possible...
A few pre-requisite questions:
MachineKey
value and decryption algorithm? I know ASP.NET 1.0 used 3DES but newer versions generally use AES by default.FormsAuthenticationTicket
was not intended to be "broken", and if you were going to access these values from a different language you may consider rolling your own scheme.Some noteworthy observations:
Buried
in FormsAuthentication.Decrypt()
is a call toUnsafeNativeMethods.CookieAuthParseTicket(...)
. Here is the signature:This parses what looks to be a byte array returned from
MachineKeySection.HexStringToByteArray()
(apparently a function that appears to decode the string using UTF-8) into the individual members of theFormsAuthenticationTicket
.I can only assume that no matter which decoding method you use (ASCII, UTF-16, etc.) you're not going to get the data back unless you know Microsoft's implementation hidden in this native method.
MSDN may also offer some help.
我一直在努力解决这个问题,并且成功地以 PHP 获取了表单身份验证票证内容。
使用在 .Net 端加密票证时使用的相同密钥对票证进行解密。 为此,我使用 http://www.navioo.com /php/docs/function.mcrypt-encrypt.php.
解密将填充添加到字符串的末尾,我将其删除。
我留下了一个字符串,末尾带有 20 字节 SHA1 哈希值。 最后 20 个字节(应该)与字符串第一部分的 SHA1 哈希值(字符串长度 - 20 个字节)匹配。 我仍在研究这一部分,试图弄清楚 .NET 如何将字节数组转换为可以进行 SHA1 哈希处理的单个数据块(这样我就可以在 PHP 端执行相同的操作)。
这就是它的全部内容。
I've been working it out, and I have managed to get the forms authentication ticket contents in PHP.
Decrypt the ticket with the same key used to encrypt it on the .Net side. For this, I'm using http://www.navioo.com/php/docs/function.mcrypt-encrypt.php.
The decryption adds padding to the end of the string, I remove that.
I'm left with a string with a 20 byte SHA1 hash at the end. Those last 20 bytes (should) match the SHA1 hash of the first part of the string (string length - 20 bytes). I'm still working on this part, trying to figure out how .NET converts a byte array into a single clump of data that can be SHA1 hashed (so I can do the same on the PHP side).
That's really all there is to it.
对于其他想要执行此操作的人,请注意 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
For anyone else wanting to do this, please note that the AES encryption used by ASP.NET is always of 16-byte block size, i.e. MCRYPT_RIJNDAEL_128 in PHP mcrypt terminology, and uses CBC mode. The key length (32 bytes / 256 bits by ASP.NET default) is determined by PHP from the actual key supplied. Also, the beginning of the decrypted data seems to become corrupted unless the IV is all zeros (i.e. "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0").
For more information on decoding the data, see: http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals.aspx