PHP token生成与校验

1、密钥设置

public $secretKey = 'hgakdfkljalfdjlk';//私钥
public $termValidity = 60;//有效时常(秒)

2、调用方式

$info = ['user_id' => 1];
 
//生成密钥
$this->CreateToken( $info);
 
//校验密钥
$this->CheckToken($token);

3、基础方法

 
    /**
    *功能:生成token
    *参数一:需要解密的密文
    *参数二:密钥
    */
    function CreateToken($data = []) {
        if(empty($data)){
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return $data;
        }
 
        $data['request_time'] = time();//当前时间
        $data['term_validity'] = $this->termValidity;//过期时间
        $dataJson = json_encode( $data );
 
        //根据以上信息信息生成签名
        return $this->passport_encrypt($dataJson, $this->secretKey);
    }
 
    
    /**
    *功能:校验token
    *参数一:需要解密的密文
    *参数二:密钥
    */
    function CheckToken($token) {
 
        if (!isset($token) || empty($token)) {
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return $data;
        }
 
        $explode =$this->passport_decrypt($token, $this->secretKey); //解析token
        $expArr = json_decode($explode,true);
        $checkToken = $this->passport_encrypt(json_encode($expArr), $this->secretKey);
 
        $requestTime = $expArr['request_time'];
        $termValidity = $expArr['term_validity'];
        $checkTime = $requestTime+$termValidity;
        //对比token
        if($token != $checkToken){
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return $data;
        }
        $time = time();
        if ($time > $checkTime) {
            $data['code'] = '401';
            $data['message'] = 'Token已过期,请重新登录';
            return $data;
        }
        $data['code'] = '200';
        $data['message'] = '合法Token';
        return $data;
    }
    /*
    *功能:对字符串进行加密处理
    *参数一:需要加密的内容
    *参数二:密钥
    */
    function passport_encrypt($str,$key = 'secretKey'){ //加密函数
        return base64_encode($this->passport_key($str,$key));
    }
 
    /*
    *功能:对字符串进行解密处理
    *参数一:需要解密的密文
    *参数二:密钥
    */
    function passport_decrypt($str,$key = 'secretKey'){ //解密函数
        return $this->passport_key(base64_decode($str),$key);
    }
 
    /*
    *辅助函数
    */
    function passport_key($str,$encrypt_key){
        $encrypt_key=md5($encrypt_key);
        $ctr=0;
        $tmp='';
        for($i=0;$i<strlen($str);$i++){
            $ctr=$ctr==strlen($encrypt_key)?0:$ctr;
            $tmp.=$str[$i] ^ $encrypt_key[$ctr++];
        }
        return $tmp;
    }

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 PHP校验 token 的方法通常是使用类似 JWT(JSON Web Token)的库来实现。具体来说,你需要做以下几步: 1. 安装 JWT 的 PHP 库,比如可以使用 Composer 来安装。 2. 在代码中引入 JWT 库。 3. 使用 JWT 库中的方法来解码 token,并检查其中的数据是否有效。 4. 可以使用 JWT 库中的方法来验证 token 的签名,以确保 token 没有被篡改。 示例代码如下: ``` use \Firebase\JWT\JWT; $key = "example_key"; $token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"; try { $decoded = JWT::decode($token, $key, array('HS256')); print_r($decoded); } catch (\Exception $e) { echo 'Error: ', $e->getMessage(), "\n"; } ``` 上面的代码使用了 JWT 类的 decode 方法来解码 token,并使用给定的密钥来验证签名。如果 token 有效,则会返回其中的数据,否则会抛出异常。 注意:校验 token 的过程并不能保证 token 一定是合法的,它只是帮助你检查 token 的有效性而已。你还需要自己实现其他的安全机制,来确保 token 的发放和使用都是合法的。 ### 回答2: 在PHP中,可以使用一些方法来校验token。 首先,我们需要生成一个token,并将其存储在用户会话或cookie中。生成token的方法可以使用内置函数如`uniqid()`或使用更复杂的哈希算法如`md5()`进行处理。 ```php $token = md5(uniqid()); $_SESSION['token'] = $token; // 存储token到会话中 ``` 在进行token校验时,我们可以检查传递给服务器的token是否与存储的token匹配。 ```php if (!empty($_SESSION['token']) && isset($_POST['token']) && $_POST['token'] === $_SESSION['token']) { // token校验通过 // 其他处理逻辑 } else { // token校验失败 // 进行错误处理或跳转页面 } ``` 在某些情况下,特别是在跨站请求伪造(CSRF)的情况下,可以采用双重的防护措施来增强token的安全性。即生成一个页面特定的token,并将其存储在会话中,然后将其添加到表单提交中。在进行token校验时,不仅要检查token的一致性,还要检查来源页面是否与当前页面匹配。 ```php $token = md5(uniqid()); $_SESSION['form_token'] = $token; // 表单提交时添加token <input type="hidden" name="token" value="<?php echo $token; ?>"> ``` ```php if (!empty($_SESSION['form_token']) && isset($_POST['token']) && $_POST['token'] === $_SESSION['form_token'] && $_SERVER['HTTP_REFERER'] === '当前页面地址') { // token校验通过 // 其他处理逻辑 } else { // token校验失败 // 进行错误处理或跳转页面 } ``` 综上所述,通过生成校验token可以提高应用的安全性,防止恶意请求和攻击。但是需要注意的是,token的安全性依赖于服务器端的实现和应用的设计,因此在开发过程中应该综合考虑更多的安全措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值