美文网首页
PHP 实现RSA签名验签

PHP 实现RSA签名验签

作者: SukeBeta | 来源:发表于2019-12-27 18:21 被阅读0次
<?php
//私钥
$private_key='-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----';
//公私
$public_key='-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDqWyL8fkpHtCS0hN60Y8kchp/B
S4r6aXyu9Sdfw/z/JKL50V+dP1bZ7Dl0eJqWN+mEYMQ9D5DVA89fpqYXI3jc8Dl
yeKsjXOWpLV+a+MnmhPxO3IMP3+i+orSzJHF6kWHxgivloJVl7bq8xah2u/5BjUP
nBju+BlZK478uwU2rwIDAQAB
-----END PUBLIC KEY-----';


//php5.3及以下版本缺少hex2bin及bin2hex函数,5.3以上版本可以去掉以下两个函数
if ( !function_exists( 'hex2bin' ) ) {
    function hex2bin( $str ) {
        $sbin = "";
        $len = strlen( $str );
        for ( $i = 0; $i < $len; $i += 2 ) {
            $sbin .= pack( "H*", substr( $str, $i, 2 ) );
        }

        return $sbin;
    }
}
if ( !function_exists( 'bin2hex' ) ) {
    function bin2hex($str) {
        $hex = "";
        $i = 0;
        do {
            $hex .= dechex(ord($str{$i}));
            $i++;
        } while ($i < strlen($str));
        return $hex;
    }
}


//验证签名
function verifySign($array){

    //验证签名
    $sign_data['msg_type']      =$array['msg_type'];
    $sign_data['msg_txn_code']  =$array['msg_txn_code'];
    $sign_data['msg_crrltn_id'] =$array['msg_crrltn_id'];
    $sign_data['msg_flg']       =$array['msg_flg'];
    $sign_data['msg_sender']    =$array['msg_sender'];
    $sign_data['msg_time']      =$array['msg_time'];
    $sign_data['msg_sys_sn']    =$array['msg_sys_sn'];
    $sign_data['msg_ver']       =$array['msg_ver'];
    $sign=$array['sign'];

    //将字段名按字母表顺序排序
    ksort($sign_data);
    //将post的数据utf-8编码
    $str_data=utf8_encode(http_build_query($sign_data));

    $pkeyid = openssl_pkey_get_public($public_key);
    if (openssl_verify($str_data,hex2bin($sign), $pkeyid) === 1){
        openssl_free_key($pkeyid);
        return true;
    }else{
        openssl_free_key($pkeyid);
        return false;
    }
}

//签名
function toSign($array){
    //签名字段
    $sign_data['msg_type']      =$array['msg_type'];
    $sign_data['msg_txn_code']  =$array['msg_txn_code'];
    $sign_data['msg_crrltn_id'] =$array['msg_crrltn_id'];
    $sign_data['msg_flg']       =$array['msg_flg'];
    $sign_data['msg_sender']    =$array['msg_sender'];
    $sign_data['msg_time']      =$array['msg_time'];
    $sign_data['msg_sys_sn']    =$array['msg_sys_sn'];
    $sign_data['msg_ver']       =$array['msg_ver'];
    if(isset($array['msg_rsp_code'])){
        $sign_data['msg_rsp_code']=$array['msg_rsp_code'];
    }
    if(isset($array['msg_rsp_desc'])){
        $sign_data['msg_rsp_desc']=$array['msg_rsp_desc'];
    }

    //将字段名按字母表顺序排序
    ksort($sign_data);

    //将post的数据utf-8编码
    $str_data=utf8_encode(http_build_query($sign_data));
    //获取私钥资源ID
    $pkeyid = openssl_get_privatekey($private_key);

    //签名赋值sign
    if (openssl_sign($str_data, $sign, $pkeyid)){
        $sign_data=bin2hex($sign);
    }else{
        $sign_data='';
    }
    //释放ssl资源
    openssl_free_key($pkeyid);
    return $sign_data;
}


//php要安装openssl插件的啊

相关文章

网友评论

      本文标题:PHP 实现RSA签名验签

      本文链接:https://www.haomeiwen.com/subject/lybznctx.html