使用XJWT标准,此标准基于JSON Web Token (JWT)开发。XJWT包含三个参数:header, payload, signature,因此生成token就要先获得这三个参数。

class IlabJwt
{
public $TYPE_RESERVED = 0;
public $TYPE_JSON = 1;
public $TYPE_SYS = 2; public static $enableLog = true;
public static $logger = null; public $appName = 'test';
public $issuerId = 100400;
public $secretKey = '16jmp2';
public $aesKey = 'SbYymvfZ8UjEmShxRAB0b1Dtaa0uGjDOOJa/f0Mbuo4='; public function is_64bit()
{
$int = "9223372036854775807";
$int = intval($int);
if ($int == "9223372036854775807") {
/* 64bit */
return 'J';
}elseif ($int == 2147483647) {
/* 32bit */
exit('请使用64位的 PHP');
}else{
/* error */
return 'error';
}
} public function getJwt($body)
{
$body = json_encode($body, JSON_UNESCAPED_UNICODE); //JSON_UNESCAPED_UNICODE 必须
$header = $this->packHeader();
$body = $this->encrypt($body);
$base64Header = base64_encode($header);
$base64Payload = base64_encode($body);
$base64Signature = base64_encode($this->sign($base64Header, $base64Payload));
$xjwt = urlencode($base64Header.'.'.$base64Payload.'.'.$base64Signature);
return $xjwt;
} public function packHeader()
{
$header = '';
$expiry = round((microtime(true) + 900) * 1000); //900秒过期时间
$header .= pack($this->is_64bit(), $expiry);
$type = pack('n', $this->TYPE_JSON);
$header .= $type[1];
$header .= pack($this->is_64bit(), $this->issuerId);
return $header;
} public function encrypt($body)
{
$payload = '';
//前接8字节随机整数
$randLong = pack($this->is_64bit(), rand(0, PHP_INT_MAX));
$payload .= $randLong;
$payload .= $body;
//补齐为64字节的整数倍
$tempLen = strlen($payload) + 1;
$paddingLen = 16 - $tempLen % 16;
$padding = str_pad('', $paddingLen + 1, pack('c', $paddingLen));
$payload .= $padding; //aes加密
$aesKey = base64_decode($this->aesKey);
$iv = substr($aesKey, 0, 16);
$payload = openssl_encrypt($payload, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
return $payload;
} public function sign($base64Header, $base64Payload)
{
$signature = hash_hmac('sha256', $base64Header . '.' . $base64Payload, $this->secretKey, true);
return $signature;
} public function getBody($jwt)
{
list($base64Header, $base64Payload, $base64Signature) = explode('.', $jwt);
$header = base64_decode($base64Header);
$payload = base64_decode($base64Payload);
$signature = base64_decode($base64Signature);
if (!$this->validateSignature($signature, $base64Header, $base64Payload)) {
// var_dump('Signature is invalid.');
var_dump('Signature is invalid.');
return 'error:Signature is invalid.';
} //header:expiry
$expiry = substr($header, 0, 8);
if ($this->isExpired($expiry)) {
var_dump('Data is expired.');
return 'error:Data is expired.';
} //header:type
$type = substr($header, 8, 1);
if (!$this->isValidType($type)) {
var_dump('Type is invalid.');
return 'error:Type is invalid.';
} //header:issuerid
$issuerId = substr($header, 9);
if (!$this->isValidIssuer($issuerId)) {
var_dump('Issuer is invalid.');
return 'error:Issuer is invalid.';
} //payload
$body = $this->decrypt($payload);
if (!$body) {
return 'error:The wrong payload';
} //['id' => xxx, 'un' => 'xxx', 'dis' => 'xxx']
return json_decode($body, true); } public function isExpired($expiry)
{
$expiry = unpack($this->is_64bit(), $expiry);
$expiry = $expiry[1] / 1000;
var_dump('Expiry : ' . date("Y-m-d H:i:s",intval($expiry)));
return (time() < $expiry);
} public function isValidType($type)
{
$type = unpack('n', "\0" . $type);
$type = $type[1];
var_dump('Type : ' . $type);
return $type === $this->TYPE_JSON;
} public function isValidIssuer($issuerId)
{
$issuerId = unpack($this->is_64bit(), $issuerId);
$issuerId = $issuerId[1];
var_dump('IssuerId : ' . $issuerId);
return $issuerId === $this->issuerId;
} public function decrypt($payload)
{
$aesKey = base64_decode($this->aesKey);
$iv = substr($aesKey, 0, 16);
$data = openssl_decrypt($payload, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
$dataLen = strlen($data);
$paddingLen = unpack('n', "\0" . $data[$dataLen - 1]);
$paddingLen = $paddingLen[1];
$body = substr($data, 8, - $paddingLen - 1);
var_dump('Body : ' . $body);
return $body;
} public function validateSignature($signature, $base64Header, $base64Payload)
{
$caculatedSignature = $this->sign($base64Header, $base64Payload);
var_dump('Caculated signature (base64 code) : ' . base64_encode($caculatedSignature)
. ', received signature (base64 code) : ' . base64_encode($signature));
return (base64_encode($caculatedSignature) === base64_encode($signature));
} public function log($message, $type = 'info', $errno = null, $error = '', $file = null)
{
return;
}
}

使用方法:

$token = (string)$_GET['token'];
$ilab = new IlabJwt();
$result = $ilab->getBody($token);
var_dump($result); #技术支持 方倍工作室

示例:

http://www.fangbei.org/tests/Ilab.php?token=AAABbRVKvGoBAAAAAAABiDA%3D.FN8Stlr2dWWsswAOq%2FlcJSboAOwzXGSb0nzPV7Ek1eiDBRJOT%2BZgllMiIwI4CtylOMrs6TaIW2HIeRxEqpwdM79SBpwuRbiyW4mLudHVrsHm1v2A7z1DYaUHpMZK%2BGF3u2l6CzMGTDvsQgOL4TUxPYwSN6%2FpC8k1szv36UIPAXydfK9vfDCIE%2FpwIU6XJVOrGGT8AFVfxNWn40%2FYDUTfpzoI8Cd09ZpxFqIxu8cQFu%2FhMDfUZ5F1jk2y%2FUOUW0zMR62SnVRKCr8YGUQV39oNlCQRSYrzJApXfpeVJNC1%2FyomujpfWWReJLP1QiMKnzoDARhAhRL%2BtODL1yXQQoUIJg%3D%3D.qmxiLXrOBDMVSInTgs%2B944v7Jf9YZ8stPAcEubfvCgQ%3D

返回

array(5) {
["id"]=>
int(854)
["un"]=>
string(5) "test4"
["dis"]=>
string(18) "实验空间测试"
["orderId"]=>
string(0) ""
["key"]=>
string(172) "6bvL4uSUhZPCpKaSa8hA400uusujXi8HqP/dTRFjWA6EoSOBjnXzIcg9C0DhG6SaHYbSDuoX6pTvnIbP6wDGm2tjZClJNxpPLHR693dznJCBrwi7hFRlFeSdehBuE+BMRc1NDWoXNCEeDXbrOs2UblO5UqMbGk+WRL3gudRnIlw="
}

国家虚拟仿真实验教学项目共享平台(实验空间)PHP SDK的更多相关文章

  1. 捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?

    摸不了鱼了 2019 年 11 月 26 日,本来应该是无比平静的一天,开开会,改改bug,摸摸鱼之后等着下班.刷着新闻的间隙,手机的消息提示音响了起来,收到了一条邮件,平时收到邮件我都会选择稍后处理 ...

  2. 茂名石化BPM应用实践 ——业务协同及服务共享平台建设和应用

    一.茂名石化简介 茂名石化隶属于中国石油化工集团公司,创建于1955年,是国家"一五"期间156项重点项目之一.经过50多年的发展,茂名石化已成为我国生产规模最大的炼油化工企业之一 ...

  3. 基于Wiki的知识共享平台模型架构

    一.引言 当今的全球化知识经济社会中呈现出信息泛滥和知识更新周期短的现象,知识管理逐渐成为现代企业管理中不容忽视的一环.虚拟企业是基于共识目标而组成的动态协作组织,成员参与的流动性与各成员之间地域分布 ...

  4. 资料共享平台----nabcd

    知识共享平台NABCD模型 N(need)需求 大一新生刚刚开始大学生活,不适应大学学习生活的节奏,并且课堂上知识容量大.密度高,学生不能立刻掌握所学知识点,同时,网上资料冗杂繁复,指向性不强,导致学 ...

  5. 2017-2018-2 20155228 《网络对抗技术》 实验一:PC平台逆向破解

    2017-2018-2 20155228 <网络对抗技术> 实验一:PC平台逆向破解 实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用 ...

  6. C#应用视频教程2.1 OPENGL虚拟仿真介绍

    OPENGL的虚拟仿真对于工控自动化的意义很大,虽然市面上有很多的第三方软件比如Solidworks,Mathlab,ProE等等软件可以做仿真,而且能够实现的功能包括了流体分析,力学分析,摩擦力分析 ...

  7. DeltaFish 校园物资共享平台 第一次小组会议

    软工小组第一次会议 会议地点:图书馆 会议时间:19:00 ~ 20:00 与会人员:软工小组全体成员 请假人员:无缺席人员:无 记录人:陈志锴 整理人:曾子轩 会议记录 一.确认选题 每一位成员提出 ...

  8. 05.Linux系统-WCP知识共享平台安装部署(旗舰版)

    WCP知识共享平台部署 一.环境准备 操作系统:CentOS Linux release 7.5.1804 (Core) Java:jdk-7u79-linux-x64.tar.gz 中间件:apac ...

  9. Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)

    1.序列化和反序列化 1.1.概述 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize()序列化说通俗点就是把一个对象变成 ...

随机推荐

  1. 钉钉SDK使用。

    (1)到 https://open-doc.dingtalk.com/microapp/faquestions/vzbp02 下载SDK (2)引入 using DingTalk.Api; using ...

  2. [Delphi]无边框窗口最大化不挡任务栏方法

    procedure WMGetMinMaxInfo(var mes: TWMGetMinMaxInfo); message WM_GetMinMaxInfo; procedure TfrmMain.W ...

  3. NIO你真正了解多少?

    解释一下java.io.Serializable接口 类通过实现 Java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化. IO操作最佳实 ...

  4. Bacula Plugins

    1. loadPlugin 插件通过加载动态库loadPlugin函数开始,此函数包括bacula的回调和Plugin的注册 bacula的回调 typedef struct s_baculaFunc ...

  5. ios视频网盘

    http://pan.baidu.com/share/home?uk=1711799154#category/type=0

  6. 白话SCRUM之五:四种会议

    在SCRUM方法中定义了4种会议活动: Sprint planning Daily meeting Sprint review Sprint retrospective 除去开发活动外这4种会议构成了 ...

  7. 8.了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

    作者:中华石杉 面试题 了解什么是 redis 的雪崩.穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实这是问到缓存必问的,因为缓 ...

  8. Django forms 主要的标签介绍

    修改 forms.py from django import forms as DForms from django.forms import fields from django.forms imp ...

  9. Django Windows+IIS+wfastcgi 环境下部署

    教程基于 Windows 10专业版 + Python3.6 + IIS + wfastcgi 之上部署Django2.2的,同样适用于Windows server2012服务器和Windows7及以 ...

  10. CF891B Gluttony

    原题链接 DOWNLOAD AS PDF 题目大意 给你一个有\(n\)个元素的数组\(a\),让你构造一个数组\(b\),满足从 \(a\).\(b\)中任选出\(k\)个下标对应的元素,它们的和不 ...