PHP加解密介绍

1. mcrypt加解密 – 此方法不推荐使用

public function enstrhex($str,$key) {       
   /* 开启加密算法 */  
   $td = mcrypt_module_open('twofish', '', 'ecb', '');      
   /* 建立IV,并检测key的长度*/         
   $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);      
   $ks = mcrypt_enc_get_key_size($td);      
   /* 生成key */     
   $keystr = substr(md5($key), 0, $ks);       
   /*初始化加密程序*/     
   mcrypt_generic_init($td, $keystr, $iv);      
   /* 加密, $encrypted 保存的是已经加密后的数据*/   
   $encrypted = mcrypt_generic($td, $str);   
   /* 检测解密句柄,并关闭模块*/ 
   mcrypt_module_close($td); 
   /* 转化为16进制*/ 
   $hexdata = bin2hex($encrypted);      
   //返回        
   return $hexdata; 
} 
   
public function destrhex($str,$key) { 
    /* 开启加密算法*/ 
    $td = mcrypt_module_open('twofish', '', 'ecb', ''); 
    /* 建立IV,并检测key 的长度*/ 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
    $ks = mcrypt_enc_get_key_size($td);  
    /* 生成key */         
    $keystr = substr(md5($key), 0, $ks); 
    /*初始化加密模块,用以解密*/ 
    mcrypt_generic_init($td, $keystr, $iv); 
    /*解密*/         
    $encrypted = pack( "H*", $str); 
    $decrypted = mdecrypt_generic($td, $encrypted); 
    /* 检测解密句柄,并关闭模块*/ 
    mcrypt_generic_deinit($td);    
    mcrypt_module_close($td);      
    /* 返回原始字符串*/ 
    return $decrypted; 
} 

2. RSA加解密

/**
 * Desc: RSA 加密
 * Date: 2020/1/14
 * Time: 15:33
 * @param $data
 * @return bool|string
 */
public static function rsaSign($data){
    // 读取私钥文件
    $priKey = file_get_contents(CgConfig::$privateKeyFilePath);

    // 转换为openssl格式密钥
    $res = openssl_get_publickey($priKey);

    $sign = false;
    if (openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256)) {
        $sign = base64_encode($sign);
    }
    return $sign;
}

/**
 * Desc: RSA 解密
 * Date: 2020/1/14
 * Time: 15:33
 * @param $data
 * @param $sign
 * @return bool
 */
public static function rsaVerify($data,$sign){
    // 读取公钥文件
    $pubKey = file_get_contents(CgConfig::$publiKeyFilePath);

    // 转换为openssl格式密钥
    $res = openssl_get_publickey($pubKey);

    $ret = false;
    $sign = base64_decode($sign);

    if ($sign !== false) {
        switch (openssl_verify($data, $sign, $res, "SHA256")) {
            case 1:
                $ret = true;
                break;
            case 0:
            case -1:
            default:
                $ret = false;
                break;
        }
    }
    return $ret;
}

3. AES加解密

/**
 * Desc: AES加密
 * Created by Joker
 * Date: 2019/6/27
 * Time: 09:53
 * @param $data
 * @param $k
 * @param $v
 * @return string
 */
public static function aesEncrypt($data,$k,$v){
    $returnData = openssl_encrypt($data,'AES-128-CBC',$k,OPENSSL_RAW_DATA,$v);
    return base64_encode($returnData);
}

/**
 * Desc: AES解密
 * Created by Joker
 * Date: 2019/6/27
 * Time: 09:53
 * @param $data
 * @param $k
 * @param $v
 * @return string
 */
public static function aesDecrypt($data,$k,$v){
    $returnData = openssl_decrypt(base64_decode($data),'AES-128-CBC',$k,OPENSSL_RAW_DATA,$v);
    return json_decode($returnData,true);
}

4. 自定义加解密

/**
 * Desc: 公共的参数加密
 * Created by: Joker
 * Date: 2020/1/14
 * Time: 15:42
 * @return array|string
 */
public function encryptParams(){
    $data['params'] = $_GET;
    $signStr = '';
    foreach($_GET as $v){
        if(is_array($v)){
            return ['retCode'=>1004];
        }else{
            $signStr .= $v;
        }
    }
    $data['signStr'] = md5(urlencode($signStr));// 在生成md5字符串时可以拼接一个设置的支付串在里面,这样可以作为正式环境和测试环境的区别
    return base64_encode(json_encode(($data)));
}

/**
 * Desc: 公共的參數解密方法
 * Created by: Joker
 * Date: 2019/8/5
 * Time: 15:26
 * @param $data
 * @return array
 */
private function decode($data){
    $data = json_decode(base64_decode($data),true);
    if(!isset($data['params']) || empty($data['signStr'])|| !is_array($data['params'])||!is_string($data['signStr'])){
        return ['retCode'=>1003];
    }

    ksort($data['params']);
    $signStr = '';
    foreach($data['params'] as $v){
        if(is_array($v)){
            return ['retCode'=>1004];
        }else{
            $signStr .= $v;
        }
    }

	// 如果上面的生成加密字符串时添加了设置的字符串在里面,那么在解密时也需要加入该字符串 
    if(md5(strtolower(urlencode($signStr)))!= $data['signStr']){
        return ['retCode'=>1005];
    }

	// 将解密之后的参数放在公共的变量里面,之后好在任意控制器使用
    $this->params = $data['params'];
    return ['retCode'=>1000];
}

/**
 * Desc: 解析 token 並獲取用戶信息
 * Created by: Joker
 * Date: 2019/8/6
 * Time: 10:28
 * @param $token
 * @return array
 */
private function analysisToken($token){
    $data = json_decode(base64_decode($token),true);
    if(empty($data['params'])|| empty($data['signStr'])|| !is_array($data['params'])||!is_string($data['signStr'])){
        return ['retCode'=>1007];
    }

    if(empty($data['params']['member_id']) || !isset($data['params']['last_login_time'])){
        return ['retCode'=>1007];
    }

    ksort($data['params']);

    // 獲取用戶的信息
    $this->memberInfo = Member::findOne(['member_id'=>$data['params']['member_id']]);

    if(!$this->memberInfo){
        return ['retCode'=>1007];
    }

    if($this->memberInfo->last_login_time != $data['params']['last_login_time']){
        return ['retCode'=>1007];
    }
    if($data['signStr'] != sha1(sha1(md5(json_encode($data['params']))) . \Yii::$app->params['TOKEN_SIGN_STR']) ){
        return ['retCode'=>1007];
    }
    return ['retCode'=>1000];
}

/**
 * Desc: 生成token
 * Created by: Joker
 * Date: 2019/8/6
 * Time: 10:40
 * @param $member_id
 * @return string
 */
public function createToken($member_id){
    $memberInfo = Member::findOne(['member_id'=>$member_id]);
    if(!$memberInfo){
        return "";
    }

    // 對會員信息加密處理
    $arr = [
        'last_login_time'=>$memberInfo->last_login_time,
        'member_id'=>$member_id,
    ];
    ksort($arr);

    // 生成 signStr
    $signStr = sha1(sha1(md5(json_encode($arr))) . \Yii::$app->params['TOKEN_SIGN_STR']);

    $token = base64_encode(json_encode(['params'=>$arr,'signStr'=>$signStr]));
    return $token;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joker_PL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值