zoukankan      html  css  js  c++  java
  • RSA 加密传输 (php)

    RSA加密传输:

      对于初接触RSA加密的童鞋来说,很可能会被绕进去。最近写了一个RSA加密传输的需求,总结一下。希望能对你有点帮助。

      首先要明白以下几点:

        1:公钥和私钥一定是成对的才可以

        2:私钥是保密的,公钥是公开的

        3:公钥和私钥,可以互为加密和解密

        4:用其中一个密钥加密数据,则只有对应的那个密钥才能解开

    主要有两种用法

      1:公钥加密

        A传输数据给B

          (1),A用公钥加密数据,传输给B

          (2),B用私钥解密

      2:公钥认证

        A传输数据给B

          (1),A用私钥加密数据(也就是私钥签名),传输给B

          (2),B用公钥解密(也就是验签)

    示例:证书,公钥认证的过程

    签名:

        /**
        signing  签名 password   私钥证书需要密码
         */
        public function get_signing_str($data){
            //$data=$this->get_request_string();
            $certs=array();
           // dump(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx"));
            openssl_pkcs12_read(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx"), $certs, "password");
            if(!$certs) return;
            $signature = '';
            openssl_sign($data, $signature, $certs['pkey'],'sha256');
            //dump(base64_encode($signature));
            return base64_encode($signature);
        }

    验签:

    public function verify_signing($rest){
            $rest=json_decode($rest,true);
            $sign=$rest['sign'];
            $sign = base64_decode($sign);//签名参数
            unset($rest['sign']);
            unset($rest['sign_type']);
            $verifystr=$this->get_request_str($rest);//验签明文字符串
            $pkeyid = openssl_pkey_get_public(file_get_contents(ROOT_PATH."public/static/"."public_key.cer"));
            $verify = openssl_verify($verifystr,$sign,$pkeyid,'sha256'); //验签  (明文/签名/key)
           // $msg = openssl_error_string();
           // dump($msg);
           // dump($verify);
            openssl_free_key($pkeyid);
            if($verify==1){
                echo '验签通过';
               // $data=json_encode($rest);
               // return $data;
            }else{
                return '验签失败';
            }
        }

    RSA加密过程

            $privateKeyStr=file_get_contents(ROOT_PATH."public/static/"."pkcs1_key.pem");
            $pi_key=openssl_pkey_get_private($privateKeyStr);      
            $encryptSign="";
            openssl_private_encrypt($sign_str,$encryptSign,$pi_key);  //(待加密字符串/加密后的字符串/key)

    SHA加密过程

    $sign  = hash('sha256',$source);  //(算法/待加密字符串)
  • 相关阅读:
    iOS OC语言: Block底层实现原理 (转载)
    Objective-C中的Block(闭包) (轉載)
    http://oncenote.com/2015/09/16/Security-2-HTTPS2/ (轉載)
    iOS安全系列之一:HTTPS (轉載)
    Swif基本语法以及与OC比较三
    OC/Swift第三方添加出错解决方法
    Swift基本语法及与OC比较之二
    2015AppStore 上传步骤及常见问题
    使用AJAX日历控件,显示某些日期(CalendarExtender)
    在CheckBox中,仅仅允许选择一项
  • 原文地址:https://www.cnblogs.com/ikoala/p/7449999.html
Copyright © 2011-2022 走看看