3

我觉得我上次说的不够具体。开始了:

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

742713478fb3c36e014d004100440041004 e0041004e00000060f347d15798c9010060 6b899c5a98c9014d007900470072006f007 500700000002f0000001f7691944b9a3306 295fb5f1f57ca52090d35b50060606060606

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

试图用 PHP 做到这一点,但没有运气。你能得到一个匹配吗?

票:

742713478fb3c36e014d004100 440041004e0041004e00000060 f347d15798c90100606b899c5a 98c9014d007900470072006f00 7500700007002f9400909

附加到原始票的 sha1 哈希:

3306295fb5f1f57ca52090d35b50060606060606

我的票的 sha1 哈希:

b6ecd613698ac3533b5f853bf22f6eb4afb94239

这是票证中的内容及其存储方式。FWIW,我可以提取用户名等,并找出各种分隔符。 http://www.codeproject.com/KB/aspnet/Forms_Auth_Internals/AuthTicket2.JPG

编辑:我发现该字符串在此之前通过的解密函数在末尾填充。我删除了最后 6 个字节并相应地通过票证和哈希进行了调整。仍然不起作用,但我更接近了。

4

5 回答 5

5

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

于 2009-03-03T17:18:35.337 回答
4

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

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

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

于 2009-03-03T17:30:47.287 回答
2

首先尝试修剪字符串,在末尾有一个换行符或空格会完全改变哈希值,这非常容易。

于 2009-03-03T17:16:01.287 回答
1

根据此在线 SHA1 工具,给定文本的哈希值(删除新行和空格后)为

b6ecd613698ac3533b5f853bf22f6eb4afb94239

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

于 2009-03-03T17:40:34.503 回答
1

问题是原件是一个键控散列。我必须使用带验证密钥的 hash_hmac() 而不是不带验证密钥的 sha1()。

于 2009-03-09T17:52:42.740 回答