博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式数字签名令牌TokenProvider
阅读量:4036 次
发布时间:2019-05-24

本文共 1969 字,大约阅读时间需要 6 分钟。

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

数字签名令牌属于发明专利《基于令牌协议的令牌组网构建方法》(已授权专利号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://ytudi.baihongyu.com/

你可能感兴趣的文章
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>