最新公告
  • 欢迎访问代码工坊,购买产品可享受在线工单服务!
  • 使用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;
    }
    ?>

    通过上面的代码计算出的结果出现了我们需要的结果:

    使用php对字符串组合秘钥进行解密验签的解决思路

    拼接出的字符串为20.1161664498219388888888,通过比对我们可以得知加密方式为md5(type + price + t + key)。

    这样我们的问题就解决了,以上只是md5字符串且已知参数的解题思路,如果排列方式更复杂,或是sha256或多层加密,就不是这样简单的跑散列能够测的出了。

    发表评论