• 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);  //(算法/待加密字符串)
  • 相关阅读:
    PCMan:Ubuntu下的最快的文件管理器
    Android 不需要root权限也可卸载系统应用的adb命令
    Directory Opus --- 布局灵活的文件管理,支持文件预览,强烈推荐
    Charles 抓包网络接口请求 修改请求参数 修改返回数据
    做直播app功能测试,怎么开展?
    Python字典内置函数和方法
    pycharm2020.3安装破解版激活教程 附:无限重置时间插件(mac windows linux)
    if not用法
    nvm安装与使用
    Python批量安装.Txt文件中的类库包
  • 原文地址:https://www.cnblogs.com/ikoala/p/7449999.html
Copyright © 2020-2023  润新知