Browse Source

超过长度的解密签名

lizhen_gitee 1 year ago
parent
commit
76bcb796ca
2 changed files with 93 additions and 19 deletions
  1. 65 8
      application/api/controller/Test.php
  2. 28 11
      application/common/controller/Api.php

+ 65 - 8
application/api/controller/Test.php

@@ -13,9 +13,63 @@ class Test extends Api
     protected $noNeedLogin = '*';
     protected $noNeedRight = '*';
 
-    //验签
+    //验签,2048位,265截取
     public function verifysign(){
 
+        //解密签名开始
+        $sign = $this->request->request('sign','','trim');
+        if(empty($sign)){
+            $this->error('缺少签名');
+        }
+        $sign = base64_decode($sign);
+
+        $private_key_str = config('app_rsa.private_key');
+        $private_key = "-----BEGIN RSA PRIVATE KEY-----" .PHP_EOL.
+            wordwrap($private_key_str, 64, PHP_EOL, true) .
+            PHP_EOL."-----END RSA PRIVATE KEY-----";
+
+        $signgetdata = []; //被解密出来的数据
+        $split_len = 256;
+        $sign_split = str_split($sign, $split_len);
+        foreach($sign_split as $key => $sign_val){
+            $signgetdata_child = null;
+            openssl_private_decrypt($sign_val, $signgetdata_child, $private_key); // 使用私钥解密数据
+            $signgetdata[] = $signgetdata_child;
+        }
+
+        $signgetdata = implode('',$signgetdata);
+
+        if (!$signgetdata) {
+            $this->error('签名错误1');
+        }
+        dump($signgetdata);
+        //解密签名结束
+
+
+        //接收到的参数,组成我自己的验签体string
+        $request_all = $this->request->request();
+        unset($request_all['s']);
+        unset($request_all['sign']);
+        ksort($request_all);
+
+        $request_str = '';
+        foreach($request_all as $key => $param){
+            $request_str .= $key.'='.$param.'&';
+        }
+        $request_str .= 'signkey=F_dC923_35270PdsIIUIUTRERYTYYU';
+        dump($request_str);
+
+        //作对比
+        if($request_str != $signgetdata){
+            $this->error('验签错误');
+        }
+
+        echo '验签正确';
+    }
+
+    //验签
+    public function verifysign_old(){
+
         //解密签名
         $sign = $this->request->request('sign','','trim');
         if(empty($sign)){
@@ -33,7 +87,7 @@ class Test extends Api
         if (!$signgetdata) {
             $this->error('签名错误');
         }
-        dump($signgetdata);
+        //dump($signgetdata);
 
         //接收到的参数
         $request_all = $this->request->request();
@@ -42,16 +96,17 @@ class Test extends Api
         ksort($request_all);
         $request_all = http_build_query($request_all);
         $request_all .= '&signkey=F_dC923_35270PdsIIUIUTRERYTYYU';
-        dump($request_all);
+        //dump($request_all);
 
         //作对比
         if($request_all != $signgetdata){
             $this->error('验签错误');
         }
 
-        echo '验签正确';
-    }
+        //echo '验签正确';
 
+        return true;
+    }
 
     //加密
     public function jiami(){
@@ -65,9 +120,11 @@ class Test extends Api
 //        dump($request_all);
         $request_all = http_build_query($request_all);
         $request_all .= '&signkey=F_dC923_35270PdsIIUIUTRERYTYYU';
-        echo $request_all;
+//        echo '加密字符串';
+//        echo $request_all;
 
         $public_key_str = config('app_rsa.public_key');
+        echo strlen($public_key_str);exit;
         $public_key = "-----BEGIN PUBLIC KEY-----" .PHP_EOL.
             wordwrap($public_key_str, 64, PHP_EOL, true) .
             PHP_EOL."-----END PUBLIC KEY-----";
@@ -76,8 +133,8 @@ class Test extends Api
         $sign = '';
         openssl_public_encrypt($request_all,$sign,$public_key);
         $sign = base64_encode($sign);
-
-        $this->success('获得签名',$sign);
+        echo '获得签名';
+        dump($sign);
     }
 
 

+ 28 - 11
application/common/controller/Api.php

@@ -92,10 +92,11 @@ class Api
         }
     }
 
-    //验签
+
+    //验签,2048位,265截取
     public function verifysign(){
 
-        //解密签名
+        //解密签名开始
         $sign = $this->request->request('sign','','trim');
         if(empty($sign)){
             $this->error('缺少签名');
@@ -107,32 +108,48 @@ class Api
             wordwrap($private_key_str, 64, PHP_EOL, true) .
             PHP_EOL."-----END RSA PRIVATE KEY-----";
 
-        $signgetdata = ''; //被解密出来的数据
-        openssl_private_decrypt($sign, $signgetdata, $private_key); // 使用私钥解密数据
+        $signgetdata = []; //被解密出来的数据
+        $split_len = 256;
+        $sign_split = str_split($sign, $split_len);
+        foreach($sign_split as $key => $sign_val){
+            $signgetdata_child = null;
+            openssl_private_decrypt($sign_val, $signgetdata_child, $private_key); // 使用私钥解密数据
+            $signgetdata[] = $signgetdata_child;
+        }
+
+        $signgetdata = implode('',$signgetdata);
+
         if (!$signgetdata) {
-            $this->error('签名错误');
+            $this->error('签名错误1');
         }
         //dump($signgetdata);
+        //解密签名结束
+
 
-        //接收到的参数
+        //接收到的参数,组成我自己的验签体string
         $request_all = $this->request->request();
         unset($request_all['s']);
         unset($request_all['sign']);
         ksort($request_all);
-        $request_all = http_build_query($request_all);
-        $request_all .= '&signkey=F_dC923_35270PdsIIUIUTRERYTYYU';
-        //dump($request_all);
+
+        $request_str = '';
+        foreach($request_all as $key => $param){
+            $request_str .= $key.'='.$param.'&';
+        }
+        $request_str .= 'signkey=F_dC923_35270PdsIIUIUTRERYTYYU';
+        //dump($request_str);
 
         //作对比
-        if($request_all != $signgetdata){
+        if($request_str != $signgetdata){
             $this->error('验签错误');
         }
 
         //echo '验签正确';
-
         return true;
     }
 
+
+
     /**
      * 初始化操作
      * @access protected