国家虚拟仿真实验教学项目共享平台(实验空间)PHP SDK
使用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的更多相关文章
- 捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?
摸不了鱼了 2019 年 11 月 26 日,本来应该是无比平静的一天,开开会,改改bug,摸摸鱼之后等着下班.刷着新闻的间隙,手机的消息提示音响了起来,收到了一条邮件,平时收到邮件我都会选择稍后处理 ...
- 茂名石化BPM应用实践 ——业务协同及服务共享平台建设和应用
一.茂名石化简介 茂名石化隶属于中国石油化工集团公司,创建于1955年,是国家"一五"期间156项重点项目之一.经过50多年的发展,茂名石化已成为我国生产规模最大的炼油化工企业之一 ...
- 基于Wiki的知识共享平台模型架构
一.引言 当今的全球化知识经济社会中呈现出信息泛滥和知识更新周期短的现象,知识管理逐渐成为现代企业管理中不容忽视的一环.虚拟企业是基于共识目标而组成的动态协作组织,成员参与的流动性与各成员之间地域分布 ...
- 资料共享平台----nabcd
知识共享平台NABCD模型 N(need)需求 大一新生刚刚开始大学生活,不适应大学学习生活的节奏,并且课堂上知识容量大.密度高,学生不能立刻掌握所学知识点,同时,网上资料冗杂繁复,指向性不强,导致学 ...
- 2017-2018-2 20155228 《网络对抗技术》 实验一:PC平台逆向破解
2017-2018-2 20155228 <网络对抗技术> 实验一:PC平台逆向破解 实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用 ...
- C#应用视频教程2.1 OPENGL虚拟仿真介绍
OPENGL的虚拟仿真对于工控自动化的意义很大,虽然市面上有很多的第三方软件比如Solidworks,Mathlab,ProE等等软件可以做仿真,而且能够实现的功能包括了流体分析,力学分析,摩擦力分析 ...
- DeltaFish 校园物资共享平台 第一次小组会议
软工小组第一次会议 会议地点:图书馆 会议时间:19:00 ~ 20:00 与会人员:软工小组全体成员 请假人员:无缺席人员:无 记录人:陈志锴 整理人:曾子轩 会议记录 一.确认选题 每一位成员提出 ...
- 05.Linux系统-WCP知识共享平台安装部署(旗舰版)
WCP知识共享平台部署 一.环境准备 操作系统:CentOS Linux release 7.5.1804 (Core) Java:jdk-7u79-linux-x64.tar.gz 中间件:apac ...
- Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)
1.序列化和反序列化 1.1.概述 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize()序列化说通俗点就是把一个对象变成 ...
随机推荐
- DAX 第七篇:分组聚合
DAX有三个用于生成分组聚合数据的函数,这三个函数有两个共同的特征:分组列和扩展列. 分组列是用于分组的列,只能来源于基础表中已存的列,分组列可以来源于同一个表,也可以来源于相关的列. 扩展列是由na ...
- 记录自己运行eShopOnContainers过程中遇到的坑
由于各种各样的问题,依照官方文档运行eShopOnContainers项目遇到了好多莫名其妙的错误. 好在最后都解决了,在此记录,以防自己以后再遇到,也为遇到同样问题的同学提供参考. 参考的官方文档 ...
- 将VMWare中的虚拟机时间设定在一个固定值
1.关闭虚拟机 2.用记事本打开虚拟机的.vmx文件 在末尾添加添加: tools.syncTime = "FALSE" time.synchronize.continue = ...
- Vue--运行项目发送http://localhost:8080/sockjs-node/info请求报错,造成浏览器不能热更新
今早习惯打开vscode 输入 npm run dev 准备修复测试提出的bug 不料一堆通红的报错,让人感到有点绿的慌. 有问题呢,就需要解决问题.经过一番排查后发现是我昨天为了让测试在我本地项目中 ...
- Unity导出Gradle工程给Android Studio使用
1 Unity导出Gradle项目 Unity打包时Build System选择Gradle,勾选Export Project 2 Android Studio导入Unity导出的Gradle项目 打 ...
- [b0018] python 归纳 (四)_运算符重载
# -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...
- MyCat教程六:全局序列号-全局主键的自增长
前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCa ...
- 解决IDEA springBoot读取*.properties文件中文内容乱码的问题
1. 配置 properties 文件 2. 读取 sex 属性输出到页面, 中文乱码 3. file --> settings 4. Editor --> File Encodings ...
- Redis缓存实战教程
目录 Redis缓存 使用缓存Redis解决首页并发问题 1.缓存使用的简单设计 2.Redis的整合步骤 A 将Redis整合到项目中(Redis+Spring) B 设计一个数据存储策越 3.Re ...
- Centos7安装JDK环境配置
作为一名程序员,各种环境搭建都要会. 下面介绍关于Linux操作系统之centos7(64位)安装JDK以及环境配置. 下面开始学习吧 查看并卸载CentOS自带的OpenJDK 安装好的CentOS ...