使用php对字符串组合秘钥进行解密验签的解决思路
小编这里有一组get请求的报文信息,参数如下,其中还有一个隐含参数key=88888888,未在url中,但参与计算。
mchId=666666&t=1616644982193&type=2&price=0.1&sign=7160a0a0f4f54cc20161ba2fecd55a08
从中可知共有mchID、t、type、price、key五个常驻参数和sign签名字符串,我们需要通过这5个参数组合拼接出字符串进行md5计算后与sign进行比对,以期求出其中的组合算法。
整体的解题思路与穷举法类似,只是我们已经获知了重要参数,所以试错范围已经尽可能缩小了。
我们先以五个参数都参与计算的方式,写入一个数组内进行打散,而后直接拼接进行md5计算比对,思路已有,代码如下。
<?php
function make_password(){
// 密码字符集,可任意添加你需要的字符
$str = array('666666', '1616644982193', '2', '0.1', '88888888');
shuffle($str);
$password = implode($str,'');
return $password.'!!!!!!'.md5($password).'
';
}
for($i = 0; $i < 5000; $i++){
$password=make_password();
echo $password;
}
?>
其中我们使用for循环5000次的方式来保证计算数量能够覆盖到我们需要的结果,可根据数组数量增加或减少,通过测试发现并没有我们需要的值。
接着分析判断有可能mchID未参与计算,所以去掉该参数,代码如下:
<?php
function make_password(){
// 密码字符集,可任意添加你需要的字符
$str = array('1616644982193', '2', '0.1', '88888888');
shuffle($str);
$password = implode($str,'');
return $password.'!!!!!!'.md5($password).'
';
}
for($i = 0; $i < 5000; $i++){
$password=make_password();
echo $password;
}
?>
通过上面的代码计算出的结果出现了我们需要的结果:
拼接出的字符串为20.1161664498219388888888,通过比对我们可以得知加密方式为md5(type + price + t + key)。
这样我们的问题就解决了,以上只是md5字符串且已知参数的解题思路,如果排列方式更复杂,或是sha256或多层加密,就不是这样简单的跑散列能够测的出了。