• php 实现签名验签


    本人php菜鸟,主要使用php实现简单的签名验签功能

    以下php代码使用的密钥格式为pem格式,其他证书格式可以使用openssl进行转换(未安装请实现安装):

    以下是.p12文件导出pem格式公私钥命令:

    //1.生成1.key文件
    openssl pkcs12 -in XXX.p12 -nocerts -nodes -out 1.key
    //2.导出私钥
    openssl rsa -in 1.key -out XXX.pem
    writing RSA key
    //3.导出公钥
    openssl rsa -in 1.key -pubout -out XXX.pem

    以下是.der文件导出公钥命令:

    openssl x509 -inform der -in XXX.der -outform pem -out cert.pem

    从 certificate 输出
    openssl x509 -in cert.pem -pubkey -noout > XXX.pem

    签名:

    /**
         * 请求内容进行签名
         * @param  [String] $content 请求内容-签名
         * 
         */
        public  function sign($content){
    //
    privateKey 密钥文件绝对路径(相对路径不知道可不可以,没试过)
    if(!file_exists($this->privateKey)){
                throw new Exception("私钥证书不存在", 1);
    
            }
                //获取私钥证书内容
                $privatePem=file_get_contents($this->privateKey);
                
                
                //获取私钥
                $privateKey = openssl_get_privatekey($privatePem);
    
                //使用的加密算法官网可以查
    
                openssl_sign($content,$resign,$privateKey,“sha256WithRSAEncryption”);
    
                openssl_free_key($privateKey);
                
                //返回的是aciss字符表示的字符串,根据情况再次进行编码,有的案例做的是base64编码,当然在验签的时候也要解码,我做的是转成十六进制的表示的字符串,我就不贴出来了
               。。。。。。
           。。。。。
    return $sign; }

    验签:

    
    

    /**

    * @param [String] $data 验签原文内容
    * @param [String] $sign [响应签名]
    * @return [int] 验签是否通过 0:不通过 1:通过
    */
    function verify($data,$sign){
    if(!file_exists($this->publicKey)){
    throw new Exception("公钥证书不存在", 1);
    }
    //获取公钥内容
    $pem=file_get_contents($this->publicKey);

    $publicKey=openssl_pkey_get_public($pem);

    
    

    //如果对签名内容进行过编码,在事先解码会原来的内容

    
    

    $flag=openssl_verify($data,$sign,“sha256WithRSAEncryption”);


    openssl_free_key($publicKey);

    
    

    return $flag;
    }

     
  • 相关阅读:
    ThinkPHP 中 where条件 or,and 同时使用
    mysql客户端 navicat 本地导入sql文件出错
    mysql查询出所有重复的记录
    JS返回上一页并刷新
    Jquery计算指定日期加上多少天、加多少月、加多少年的日期
    JS获取当前完整的url地址以及参数的方法
    PHP 计算两个时间戳之间相差的时间
    mysql左连接右连接(查询两张表不同的数据)
    C++中的C
    C++编程思想
  • 原文地址:https://www.cnblogs.com/qizhufeitian/p/13882181.html
Copyright © 2020-2023  润新知