上次我觉得我不够具体。我们走了:

我有一个十六进制字符串:

  

742713478fb3c36e014d004100440041004   e0041004e00000060f347d15798c9010060   6b899c5a98c9014d007900470072006f007   500700000002f0000001f7691944b9a3306   295fb5f1f57ca52090d35b50060606060606

最后20个字节应该(理论上)包含第一部分的SHA1哈希(完整字符串--20个字节)。但它不适合我。

尝试用PHP做到这一点,但没有运气。你能得到一场比赛吗?

票:

  

742713478fb3c36e014d004100   440041004e0041004e00000060   f347d15798c90100606b899c5a   98c9014d007900470072006f00   7500700000002f0000001f7691944b9a

附加到原始票据的sha1哈希:

  

3306295fb5f1f57ca52090d35b50060606060606

我的sha1哈希票:

  

b6ecd613698ac3533b5f853bf22f6eb4afb94239

这是故障单中的内容以及它的存储方式。 FWIW,我可以提取用户名等,并发现各种分隔符。 http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals/AuthTicket2。 JPG

编辑:我发现字符串最后由它在此之前经过的解密函数填充。我删除了最后6个字节并相应地调整了票据和哈希值。仍然不起作用,但我离我更近了。

有帮助吗?

解决方案

您的票证是根据十六进制字符串本身计算的。也许附加的哈希是在相同数据的另一个表示上计算的?

其他提示

我认为你对字节与字符感到困惑。

在内部,php将字符串中的每个字符都存储为一个字节。 PHP生成的sha1哈希值是20字节二进制数据的40字符(40字节)十六进制表示,因为每个二进制值需要用2个十六进制字符表示。

我不确定这是否是您的差异的实际来源,但看到这种误解让我想知道它是否相关。

首先尝试修剪字符串,很容易在末尾有一个新行或空格来完全改变散列。

根据此在线SHA1工具,给定文字的哈希值(删除新内容后)

b6ecd613698ac3533b5f853bf22f6eb4afb94239

想法:确保输入的字符不是PHP版本的十六进制数。

问题是原版是一个键控哈希。我必须使用hash_hmac()和验证密钥而不是sha1()而不是。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top