0

我正在对一个不幸的遗留应用程序进行逆向工程。我知道以下内容:

username=> 哈希函数() =>8BYUW6iFeL9mmSBW7xjzMw~~

password=> 哈希函数() =>VszQfe5n0+CooePc7CS9kw~~

散列的长度似乎总是 22 个字符。该系统是旧版 microsoft .net 应用程序。我有理由相信它们也是可以逆转的(但这可能不是真的)。

两个尾随波浪号让我觉得我应该能够识别这一点。我如何开始弄清楚使用什么类型的散列?

4

4 回答 4

2

假设尾随的 '~' 字符是填充符(这不是通常的情况(通常是 '=')),用户名出来:

f0 16 14 5b a8 85 78 bf 66 99 20 56 ef 18 f3 33

密码出来:

56 cc d0 7d ee 67 d3 e0 a8 a1 e3 dc ec 24 bd 93

十六进制。这与其他海报的 128 位一致。这听起来像是 AES-128 加密或 MD5 哈希的输出。有了这么小的样本并且不知道来源是什么,这就是我们必须离开的地方。既然你说你认为它们可能是可逆的,那就指向 AES-128。没有更大的样本,也没有输入数据,这就是它所能做的一切。

我尝试对字符串“用户名”和“密码”进行 MD5 哈希处理,它们得出不同的值。如果它是用 AES 加密的,如果没有更多提示,我们就不走运了。

祝你好运,/鲍勃·布莱恩

于 2012-08-06T01:52:57.230 回答
2

如果“hashFunction”函数是遗留应用程序的一部分,您可以使用像 .net 反射器这样的反射工具来反转代码以查看函数在做什么。

于 2012-08-01T22:13:18.063 回答
2

只是一个疯狂的猜测

64^21  <  2^128  <=  64^22 

128 位哈希的 base-64 编码需要 22 个字符。

如果您将 64 替换为 57 到 68 之间的任何整数,上述参数也将起作用。我认为 Base-67 编码并不常见,但记住这一点并没有什么坏处。

您的样本似乎至少有 63 个字符(26 个大写,26 个小写,10 个数字,加上加号)。

于 2012-08-01T22:15:21.040 回答
1

这是一个有趣的值:

Fj83STvXE+6q57GVjIi9aQ==

我只是碰巧知道它是 PI 到 37 个地方(乘以 1E37)

3141592653589793238462643383279502884

并非所有 base64 值都经过散列或加密。如果不了解产生该值的过程,就不可能对随机的 128 位字符串做很多事情。

问候,/鲍勃·布莱恩

于 2012-08-07T00:52:02.890 回答