【问题标题】:Is Forms Authentication Ticket Decryption possible with PHP?可以使用 PHP 进行表单身份验证票证解密吗?
【发布时间】:2010-10-09 09:14:31
【问题描述】:
我是一名 PHP 开发人员,对 .NET 几乎一无所知。工作中的 .NET 人员要求我将用于解密身份验证票证的 .NET 代码翻译成 PHP,以便 PHP 代码可以为我的应用程序运行设置适当的会话变量。这甚至可能吗?我盯着代码,这让我很困惑。如果有人能告诉我这不是浪费时间,我会继续尝试,因为我什至不知道。感谢您的帮助!
附加信息:我什至可以先用 PHP 抢票吗?
【问题讨论】:
标签:
c#
.net
php
authentication
encryption
【解决方案1】:
首先,打开您的 machine.config 并添加一个 machinekey 条目。根据 aspnet 2.0 的机器密钥生成器随机生成的密钥设置解密密钥和验证密钥。
请务必使用默认值,即。 AES 和 SHA1。
现在您有了 AES 解密密钥,请将其存储在某个地方,因为您将在 php 端需要它。
在您的 dot net 应用程序中,进入 web.config 并获取表单身份验证 cookie 名称,通常类似于 .ASPXAUTH
现在转到 PHP 端。下载并设置一个AES加密库,就像这个,http://phpseclib.sourceforge.net/documentation/
然后在 PHP 中你可以做这样的事情(这使用 phpsec 库):
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Crypt/AES.php');
$authCookie = $_COOKIE['_ASPXAUTH'];
echo $authCookie;
$aes = new Crypt_AES();
$aes->setKey('BCDCBE123654F3E365C24E0498346EB95226A307857B9BDE8EBA6198ACF7F03C');
echo $aes->decrypt($authCookie);
现在最终出来的将首先是 pm + SHA1 哈希 + auth ticket 的字节表示。您必须将序列化的字节转换为字符串以使其可读。其他人可以照亮最后一步吗?
【解决方案2】:
正如 Gumbo 所说,您需要考虑所涉及的算法。 asp.net 身份验证票证使用:
- 创建序列化表单
身份验证票。一个字节数组
票的表示是
已创建。
- 签署表单身份验证
票。消息认证
字节数组的代码 (MAC) 值
是通过使用算法计算的
和验证指定的密钥
和 validationKey 属性
machineKey 元素。默认情况下,
使用 SHA1 算法。
- 加密表单身份验证票证。
第二个字节数组
创建是通过使用加密
的加密方法
FormsAuthentication 类。这
加密方法内部使用
由指定的算法和密钥
解密和解密Key
machineKey 上的属性
元素。 ASP.NET 1.1 版使用
默认使用 3DES 算法。
ASP.NET 2.0 版使用
默认为 Rinjdael (AES) 算法。
【解决方案3】:
来自Microsoft KB
表单身份验证票是
用于告诉 ASP.NET 应用程序
你是谁。因此,票正在建立
表单身份验证块
安全。
票证经过加密和签名
使用配置
服务器的 Machine.config 元素
文件。 ASP.NET 2.0 使用
decryptionKey 和新的解密
元素的属性
加密表单身份验证
门票。解密属性让
您指定加密算法
使用。 ASP.NET 1.1 和 1.0 使用 3DES
加密,不可配置。
篡改票面价值是
由未能解密确定
服务器上的票。结果,
用户将被重定向到登录
页。
如果应用程序部署在
Web 场,您必须确保
每个服务器上的配置文件
共享相同的值
验证密钥和解密密钥
标签中的属性,
用于散列和
分别解密票证。
你必须这样做,因为你不能
保证哪台服务器将处理
连续的请求。更多
相关信息
FormsAuthenticationTicket 加密
和 Web 场部署
考虑,请访问以下
MSDN 网站:
因此,您可以指定要遵循的加密/解密算法和密钥。您可以在 PHP 中使用相同的解密逻辑。
【解决方案4】:
如果你知道解密算法,你肯定可以在 PHP 中实现它。