分布式数字签名令牌TokenProvider
source link: https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654082599&%3Bidx=1&%3Bsn=10abb9e37602de02b09f7fbbdbea4489
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
在分布式系统中,令牌签发系统往往需要跟令牌应用系统分离,并且应用系统可以独立验证令牌,无需请求签发系统接口。
数字签名令牌属于发明专利 《基于令牌协议的令牌组网构建方法》 (已授权专利号 201510213377.X )的一部分,设计于2013年!
在物联网平台中,设备验证服务器以及设备接入服务器是分开的,并且有很多接入服务器。验证服务器签发的令牌,可用于多台接入服务器。
功能特性
主要功能特性:
-
DSA数字签名提供安全,默认1024位,最高4096位;
-
应用系统独立验证令牌,无需请求签发系统的接口;
-
令牌短小,一般在80字符以内,降低嵌入式设备的内存消耗以及网络传输量;
-
支持物联网设备使用,常见几十块钱的民用设备或更高的工业设备;
应用场景
工作流程
物联网设备联网后,首先前往验证系统进行设备有效性验证,获取令牌,即可携带令牌访问各应用服务器。
令牌具有有效期,一般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场景显得过份臃肿!
Recommend
-
76
【集团用户】浏览器访问https://otp-dcloud.pingan.com.cn【银行用户】浏览器访问https://otp-sdb-dcloud.pingan.com.cn输入内网开机帐号密码+动态令牌的6位验证码
-
9
令牌的故事(CVE-2015-0002) cssembly
-
67
-
15
原文链接: https://learnku.com/laravel/t... 讨论请前往专业的 Laravel 开发者论坛: https://learnku.com/Laravel ...
-
13
在 .NET 开发中,CancellationToken(取消令牌)是一项比较重要的功能,掌握并合理的使用 CancellationToken 可以提升服务的性能。特别在异步编程中,我常常会以创建 Task 的方式利用多线程执行一些耗时或非核心业务逻辑,表面上看既提高了整个流程的执行速度,...
-
8
访问令牌(access token)和刷新令牌(refresh_token )酱油瓶20.1412019.07.15 18:54:15字数 256阅读 2,9621、token化的协议过程
-
13
Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Securi...
-
5
Binance Launchpad初学者指南 | 如何投资令牌销售
-
5
前言# 相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource。看名字就知道它和取消异步任务相关的,而且一看便知大...
-
5
前言# 在上篇文章浅谈C#取消令牌CancellationTokenSource一文中我们讲解了CancellationTokenSource...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK