jwt token 加解密算法 php
jwt 非敏感信息存储在本地。信息可以从token 中获取。双向加密
可以看到 token 主要由三部分组成:
- header:指定了签名算法。
- payload:可以指定用户 id,过期时间等非敏感数据。
- Signature:签名,server 根据 header 知道它该用哪种签名算法,再用密钥根据此签名算法对 head+payload 生成签名,这样一个 token 就生成了。
当 server 收到浏览器传过来的 token 时,它会首先取出 token 中的 header+payload,根据密钥生成签名,然后再与 token 中的签名比对,如果成功则说明签名是合法的,即 token 是合法的。
而且你会发现 payload 中存有我们的 userId,所以拿到 token 后直接在 payload 中就可获取 userid,避免了像 session 那样要从 redis 去取的开销。
<?php
/**
* token 生成
* $header 指定了签名算法。
* $payload 可以指定用户 id,过期时间等非敏感数据。
* $Signature 签名,server 根据 header 知道它该用哪种签名算法,再用密钥根据此签名算法对 head+payload 生成签名,这样一个 token 就生成了。
*/
function tokenEncryption($header = [],$payload = [],$salt = ''){
$header = json_encode($header);
$payload = json_encode($payload);
$signature = $header."?".$payload."|".md5($header.$payload.$salt);
$signature = base64_encode($signature);
return $signature;
}
/**
* token解密
* $signature 加密串
* $slat 密码盐
*/
function tokenDecrypt($signature,$slat = ''){
$data = base64_decode($signature);
$header = json_decode(explode("?",$data)[0],true);
$payload = json_decode(explode("|",explode("?",$data)[1])[0],true);
$signature_new = tokenEncryption($header,$payload,$slat);
if($signature_new != $signature){
return false;
}
return $data;
}
$header = [
'token'=> true,
'type' => 'md5'
];
$payload = [
'username'=>'www.z88.jcom',
];
$slat = '8848';
$token = tokenEncryption($header,$payload,$slat);
var_dump($token);
$str = tokenDecrypt($token,$slat);
var_dump($str);
运行结果 :
原创文章,作者:星辰,如若转载,请注明出处:http://www.z88j.com/39316.html