分布式数字签名令牌TokenProvider

在分布式系统中,令牌签发系统往往需要跟令牌应用系统分离,并且应用系统可以独立验证令牌,无需请求签发系统接口。

数字签名令牌属于发明专利《基于令牌协议的令牌组网构建方法》(已授权专利号201510213377.X)的一部分,设计于2013年!

在物联网平台中,设备验证服务器以及设备接入服务器是分开的,并且有很多接入服务器。验证服务器签发的令牌,可用于多台接入服务器。

功能特性

主要功能特性:

  1. DSA数字签名提供安全,默认1024位,最高4096位;

  2. 应用系统独立验证令牌,无需请求签发系统的接口;

  3. 令牌短小,一般在80字符以内,降低嵌入式设备的内存消耗以及网络传输量;

  4. 支持物联网设备使用,常见几十块钱的民用设备或更高的工业设备;

应用场景

工作流程

物联网设备联网后,首先前往验证系统进行设备有效性验证,获取令牌,即可携带令牌访问各应用服务器。

令牌具有有效期,一般2小时过期。应用服务器遇到过期令牌时,应该拒绝提供服务,设备将再次访问验证系统获取新令牌。

对于长连接通信的物联网设备,仅在连接建立的时候使用一次令牌验证身份,后续通信无需再次验证令牌,即使超过了有效期。除非网络中断需要重新建立TCP长连接。

示例详解

Nuget引用包 NewLife.Core

源码:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Web/TokenProvider.cs

生成密钥

ReadKey方法用于读取文件密钥,第二个参数可指定当密钥文件不存在时创建一组公钥私钥。

var prv = new TokenProvider();
// 加载或生成密钥
var rs = prv.ReadKey("keys/test.prvkey", true);
Assert.True(rs);
Assert.True(File.Exists("keys/test.prvkey".GetFullPath()));
Assert.True(File.Exists("keys/test.pubkey".GetFullPath()));
Assert.NotEmpty(prv.Key);

私钥由验证服务器自己保存,公钥分发到各应用服务器中。

签发令牌

为了让令牌足够短小,数据部分只有一个user字符串和有效期时间戳,user可以是用户名,也可以是设备编号。魔方OAuthServer使用了TokenProvider,平稳工作多年。

var prv = new TokenProvider();
// 生成令牌
var user = Rand.NextString(8);
var time = DateTime.Now.AddHours(2);
var token = prv.Encode(user, time);
Assert.NotEmpty(token);
var data = token.Substring(null, ".").ToBase64().ToStr();
Assert.Equal($"{user},{time.ToInt()}", data);

验证令牌

TryDecode用于解码令牌,并返回验证是否成功

// 解码令牌
var prv2 = new TokenProvider();
prv2.ReadKey("keys/test.pubkey", false);
var rs2 = prv2.TryDecode(token, out var user2, out var time2);
Assert.True(rs2);
Assert.Equal(user, user2);
Assert.Equal(time.Trim(), time2.Trim());

令牌防篡改

故意破坏令牌,把数据部分用户名改为其它账号,时间戳和签名不变,得到的新令牌无法通过应用服务器公钥的签名验证。这就让令牌具有了防篡改能力。

// 破坏数据
token = $"Stone,{time.ToInt()}".GetBytes().ToUrlBase64() + "." + token.Substring(".");
var rs3 = prv2.TryDecode(token, out var user3, out var time3);
Assert.False(rs3);
Assert.NotEqual(user, user3);
Assert.Equal(time.Trim(), time3.Trim());

总结

在JWT大行其道的今天,数字签名令牌仍然具有很多使用场景。JWT令牌实在太长了,HS256有密钥安全问题,RS256/ES256在实现上又有较高难度,它的数据部分对于非web场景显得过份臃肿!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

热力地图高德_高德地图:最新动态

高德地图是国内最专业的手机地图,超过3.2亿用户在使用!高德地图是应用商店上数据准确率最高、最省流量、躲避拥堵功能最强大的手机地图,平均每天为用户省油61万升!高德地图今日宣布上线货车导航功能,帮助全国3000万货车…

有效处理 Java 异常三原则

Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。 异常之所以是一种强大的调试手段,在于其回答了以下三个问题: 什么出了错? 在哪出的错? 为什么出错? 在有效使用异常的情况下&#x…

python读取日志错误信息_关于修复 Bug 这件“小事”|利用Python 日志查找错误也可行...

在 Python 中使用 print() 来输出某个变量从而检查参数错误是修 Bug 前期工作的常用手段。但其实 Python 日志处理用得好会节省时间用于修Bug。记日志会帮助我们理解程序中发生的事以及事情发生的顺序,也能直接观察到整个程序某个值的变化过程。不过以下5个操作细节…

人口危机 资本剥削导致生育率低迷

不久前,相关部门公布数据,2020年出生并已经到公安机关进行户籍登记的新生儿共1003.5万。对此,铁流先不做评论,我们先看数据。以下是1949年和1981年以来人口出生情况:1949年: 1275万......1981年:2064万1982…

博客园程序源代码下载

http://www.cnblogs.com/dudu/archive/2004/08/30/37613.aspx 转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/05/20/1472333.html

连不上网_手机连不上网?四种方法教你如何解决,建议收藏以备不时之需

随着科技的进步,现在家家户户大街小巷都是Wifi信号,所以无线基地已经成为生活中不可缺少的一环,但也因为这样无线干扰的情况,常常听到有人抱怨怎么无线又突然断线啦?我的wifi又连不上了?为什么无线上网速度…

关于机器学习,你应该至少学习这8个落地案例|干货集锦

机器学习、深度学习、强化学习、迁移学习,这些你到底了解多少?各种深度学习框架如TensorFlow、Caffe、MXNet等又该如何选择?如何将机器学习整合到正在开发的应用中?机器学习在金融、电商、外卖、教育等领域有哪些落地案例&#xf…

python实用脚本 知乎_停课不停学|38 个免费 Python 项目合集,从小白到老司机!...

1665 年,牛顿在剑桥三一学院就读期间,伦敦发生了著名的鼠疫。这场鼠疫几乎摧毁了整个伦敦城,无论是下层人民还是王室贵族都难逃魔掌,几乎五分之一的伦敦人都在这场鼠疫中丧生。牛顿被迫回家进行自我隔离,但就是这段清静…

c++经典编程题_全国青少年软件编程等级考试C语言经典程序题10道十

全国青少年软件编程等级考试C语言经典程序题10道十【程序91】题目:时间函数举例11.程序分析:2.程序源代码:#include "stdio.h"#include "time.h"void main(){ time_t lt; /*define a longint time varible*/lttime(NULL)…

[流水账]毕业?工作?

离正常毕业时间还有1年多, 没想到这么早就开始感受到毕业的气息了. 前几天收到去参加IBM中国研究院校友座谈会的邀请, 因为有事没过去, 今天又接到了校友蒋师兄的电话来了解我的个人情况. 接到电话时蒋师兄先核对了一下信息, 然后要我介绍一下自己, 我做事一向比较谨慎, 对涉及…

使用SQL Server分区表功能提高数据库的读写性能

首先祝大家新年快乐,身体健康,万事如意。一般来说一个系统最先出现瓶颈的点很可能是数据库。比如我们的生产系统并发量很高在跑一段时间后,数据库中某些表的数据量会越来越大。海量的数据会严重影响数据库的读写性能。这个时候我们会开始优化…

回顾周杰伦17年间的歌词,才知道他都唱了些什么

每当提到周杰伦的歌时,你首先会想到的是什么呢?双截棍?中国风?还是是方文山?或者更会有人回答说:根本听不清的歌词…… 回想起来,周杰伦的歌可以说陪伴了我们一代甚至是几代人的成长。无论是《晴…

最近公共祖先_[LeetCode] 236. 二叉树的最近公共祖先

题目链接: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree难度:中等通过率:57.2%题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:"对于有根树…

开启事物_《原神》全新角色甘雨登场 「浮生孰来」活动祈愿开启_新闻资讯_最新手游时评_原创手游资讯...

璃月地区的方方面面,都由「璃月七星」治理。由他们决议得出的策略牵动着市场的走向,因此每一条都要慎重再三。而会议之后,是谁摘录出要点,编入长长的条例中的,人们便不得而知了。璃月的千头万绪,就是这样被…

我遇到的单词

pros and cons支持者和反对者,用于辩论from scratch 从头做起转载于:https://blog.51cto.com/techfans/160809

C# 接口(Interface)

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口…

AI浪潮席卷而来,现在加入还来得及吗?

当你的朋友圈刚被 AlphaGo、Master 刷屏,没几天就听说日本有公司开始用 AI 取代员工、百度将人工智能列为未来10年最重要战略。同时一夜之间,似乎所有大公司都开始做无人驾驶…… 人工智能正以前所未有的速度,渗透、改造着各行各业。而加速这…

python数据字符_python数据清洗系列之字符串处理详解

数据清洗是一项复杂且繁琐(kubi)的工作,同时也是整个数据分析过程中最为重要的环节。有人说一个分析项目80%的时间都是在清洗数据,这听起来有些匪夷所思,但在实际的工作中确实如此。数据清洗的目的有两个,第一是通过清洗让数据可用…

networkx 画有权图_利用NetworkX画网络图

现在各种商业和开源的网络可视化的工具非常多,NetworkX - NetworkX是一个非常重要的网络分析工具。当然它侧重于对网络结构的分析,也包含了网络可视化部分。我最近由于要画一些张量网络图,所以找到了这个工具。另一个值得推荐的是Latex中基于…

将LINUX变成路由器

LINUX系统是一个强大的网络操作系统&#xff0c;本身就是一个出色的路由器&#xff0c;只要经过非常少的几步设置&#xff0c;就会使用LINUX系统本身成为一台出色的路由器。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />要想使…