我正在逆向设计一个不幸的遗留应用程序。我知道以下内容:
username
=> hashFunction()=> 8BYUW6iFeL9mmSBW7xjzMw~~
password
=> hashFunction()=> VszQfe5n0+CooePc7CS9kw~~
哈希值似乎总是22个字符。该系统是传统的microsoft .net应用程序。我有理由相信它们也是可以反转的(但这可能不是真的)。
两个拖尾的波浪让我觉得我应该能够识别出这一点。我如何开始弄清楚使用什么类型的散列?
答案 0 :(得分:2)
如果'hashFunction'函数是遗留应用程序的一部分,您可以使用像.net反射器这样的反射工具来反转代码以查看函数正在做什么。
答案 1 :(得分:2)
只是猜测
64^21 < 2^128 <= 64^22
对于128位散列的base-64编码,您需要22个字符。
如果用57到68之间的任何整数替换64,上面的参数也会起作用.Base-67编码并不常见,但是考虑到这一点并没有坏处。
您的样本似乎至少有63个字符(26个字符,26个小写字母,10个数字,加上加号)。
答案 2 :(得分: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。如果没有更大的样本和没有输入数据,那就可以用它完成所有工作。
我尝试对字符串“username”和“password”进行MD5哈希,它们会出现不同的值。如果它是用AES加密的,那么如果没有更多的提示,我们就会失败。
祝你好运, / Bob Bryan答案 3 :(得分:1)
这是一个有趣的值:
Fj83STvXE+6q57GVjIi9aQ==
我碰巧知道它是PI到37个地方(时间1E37)
3141592653589793238462643383279502884
并非所有base64值都经过哈希处理或加密。如果不了解产生该值的过程,就不可能对随机的128位字符串做很多事情。
此致 / Bob Bryan