我正在对一个不幸的遗留应用程序进行逆向工程。我知道以下内容:
username
=> 哈希函数() =>8BYUW6iFeL9mmSBW7xjzMw~~
password
=> 哈希函数() =>VszQfe5n0+CooePc7CS9kw~~
散列的长度似乎总是 22 个字符。该系统是旧版 microsoft .net 应用程序。我有理由相信它们也是可以逆转的(但这可能不是真的)。
两个尾随波浪号让我觉得我应该能够识别这一点。我如何开始弄清楚使用什么类型的散列?
我正在对一个不幸的遗留应用程序进行逆向工程。我知道以下内容:
username
=> 哈希函数() =>8BYUW6iFeL9mmSBW7xjzMw~~
password
=> 哈希函数() =>VszQfe5n0+CooePc7CS9kw~~
散列的长度似乎总是 22 个字符。该系统是旧版 microsoft .net 应用程序。我有理由相信它们也是可以逆转的(但这可能不是真的)。
两个尾随波浪号让我觉得我应该能够识别这一点。我如何开始弄清楚使用什么类型的散列?
假设尾随的 '~' 字符是填充符(这不是通常的情况(通常是 '=')),用户名出来:
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 加密的,如果没有更多提示,我们就不走运了。
祝你好运,/鲍勃·布莱恩
如果“hashFunction”函数是遗留应用程序的一部分,您可以使用像 .net 反射器这样的反射工具来反转代码以查看函数在做什么。
只是一个疯狂的猜测
64^21 < 2^128 <= 64^22
128 位哈希的 base-64 编码需要 22 个字符。
如果您将 64 替换为 57 到 68 之间的任何整数,上述参数也将起作用。我认为 Base-67 编码并不常见,但记住这一点并没有什么坏处。
您的样本似乎至少有 63 个字符(26 个大写,26 个小写,10 个数字,加上加号)。
这是一个有趣的值:
Fj83STvXE+6q57GVjIi9aQ==
我只是碰巧知道它是 PI 到 37 个地方(乘以 1E37)
3141592653589793238462643383279502884
并非所有 base64 值都经过散列或加密。如果不了解产生该值的过程,就不可能对随机的 128 位字符串做很多事情。
问候,/鲍勃·布莱恩