生成Token字符串
有的时候,我们需要生成一些Token作为标识:如认证后的标识符,资源的提取码等。一个比较常见的算法是生成一个GUID来作为Token,由于GUID的随机性和唯一性特点,作为Token是一个非常可靠的选择。
GUID是一个128bit的数组,为了方便携带,往往需要把它表述为字符串的形式。一般把它表述为如下形式:{79FAF822-7194-4FE3-8C4F-1D99BE71BC9C}。这样有一个弊病:太长了,那么我们如何把它弄短点呢?
去掉不必要的修饰符,
首先可以通过去掉无意义的括号和减号来较少长度:
var token = guid.ToString("N");
这样字符串就成为:79faf82271944fe38c4f1d99be71bc9c。感觉还是蛮长的。
使用Base64编码来表示
前面的表示方法中,是使用的16机制来表示的,如果使用Base64编码的话,则可以进一步压缩字符串
var token = Convert.ToBase64String(guid.ToByteArray()).TrimEnd('=');
这样字符串就成为:Ivj6eZRx40+MTx2ZvnG8nA。看起来稍微好一点了。
换一种Token生成方式
在使用Base64方式的编码后,Token字符串还是有20多位,有的时候还是嫌它长了。由于GUID本身就有128bit,在要求有良好的可读 性的前提下,很难进一步改进了。那我们如何产生更短的字符串呢?还有一种方式就是较少Token的长度,不用GUID,而采用一定长度的随机数,例如 64bit,再用Base64编码表示:
var rnd = new Random();
var tokenData = new
byte[8];
rnd.NextBytes(tokenData);
var token = Convert.ToBase64String(tokenData).TrimEnd('=');
由于这里只用了64bit,此时得到的字符串为Onh0h95n7nw的形式,长度要短一半。这样就方便携带多了。但是这种方式是没有唯一性保证的。不过用来作为身份认证的方式还是可以的(如网盘的提取码)。
更进一步
前面的算法中,长度和随机性倒是有了,但是没有唯一性。对于需要唯一性的场景,则需要改写一下token的生成算法了,我在这里给一个简单的示例:
class
Token
{
static
Random rnd = new
Random();
static
int seed = 0;
public
static
string Create()
{
var rndData = new
byte[4];
rnd.NextBytes(rndData);
var seedValue = Interlocked.Add(ref seed, 1);
var seedData = BitConverter.GetBytes(seedValue);
var tokenData = rndData.Concat(seedData).OrderBy(_ => rnd.Next());
return
Convert.ToBase64String(tokenData.ToArray()).TrimEnd('=');
}
}
这里我的算法非常简单:
- token由两部分组成,32位的随机数+32位的序列
- 由序列保证唯一性,由随机数保证随机性。
- 组合后再进行一次shuffle。
当然,我这个算法也有一定的局限性,如:
- Token只能在4G范围内保证唯一
- Token只能在上下文中保证唯一
- Token不是完全随机的
要解决这几个问题,实现在任何时候,任何位置,任何情况下产生的Token都具有唯一性和随机性也是能做到的。但是,要知道的是,任何功能都是附有
一定的代价的。这些条件往往带来的代价就是Token长度增加——GUID就是满足这一系列条件的算法。软件的世界没有银弹,我们只要在一定范围内找到能
解决问题的方法即可。
System.Guid guid = System.Guid.NewGuid(); //Guid 类型 string strGUID = System.Guid.NewGuid().ToString(); //直接返回字符串类型
生成Token字符串的更多相关文章
- 生成比较短的Token字符串
有的时候,我们需要生成一些Token作为标识:如认证后的标识符,资源的提取码等.一个比较常见的算法是生成一个GUID来作为Token,由于GUID的随机性和唯一性特点,作为Token是一个非常可靠的选 ...
- JAVA后端生成Token(令牌),用于校验客户端,防止重复提交
转:https://blog.csdn.net/u011821334/article/details/79390980 转:https://blog.csdn.net/joshua1830/artic ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- Java生鲜电商平台-Java后端生成Token架构与设计详解
Java生鲜电商平台-Java后端生成Token架构与设计详解 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1. ...
- Python用摘要算法生成token及检验token
原创作者:希希大队长,blog:https://cnblogs.com/dongxixi/ # 基础版,不依赖环境 import time import base64 import hashlib c ...
- JWT生成token
1.JWT简介 JSON Web Token 简称JWT.一个JWT实际上就是一个字符串,它由三部分组成,头部.载荷与签名.JWT生成的token是这样的 2.Json Web Token(JWT)生 ...
- 生成token和获取token
1.先安装模块pip install itsdangerous 举个例子:一个用户登录成功后,讲username和token作为key,value写到redis里面,判断是否失效(1.时间到了失效,2 ...
- .NET6 JWT(生成Token令牌)
一.Net 6环境下的.net core项目里如何使用JWT. 第一步,在Nuget引入JWT.Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGe ...
- .net生成随机字符串
生成随机字符串的工具类: /// <summary> /// 随机字符串工具类 /// </summary> public class RandomTools { /// &l ...
随机推荐
- HOSTS文件修改后不起作用的原因
如果是通过记事本修改,其实是没有问题的,如果有问题,网上搜到的是ipconfig /flushdns之类的 如果是批量程序写的,那就要小心了, 一定要ANSI(美标格式的,忘了英文是什么来着) 保存后 ...
- Internet History, Technology and Security (Week1)
Week1. History: Dawn of Electronic Computing War Time Computing and Conmmunication Keywords: Electro ...
- hdu_3804_Query on a tree(树链剖分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804 题意:给你一棵树,然后给出树上边的价值,然后给出x,y,问从1到x的边上不超过y的最大值为多少 ...
- HDU1272 小希的迷宫 并查集
参考网址:http://blog.sina.com.cn/s/blog_6827ac4a0100nyjy.html 解题思路: 由于这里出现的数字不一定连续的数字都会出现,所以设一个mark来标记数字 ...
- split a string in C++
This is my favourite way to iterate through a string. You can do what you want per word. string line ...
- IOS设备上网页中的页面滚动效果模拟
可能咋一看不知道我说的是个啥,因为iOS本来就用这功能的啊,还模拟它干啥?先听我说下项目背景哈 我现在开发的是一个webapp,主要是用在ipad上,这个app的大小是固定大小的,为了防止触摸它出现弹 ...
- Linux下配置Nginx按天切割日志
Nginx由于轻巧和高效的设计风格,去掉了一些额外的功能,所以它不像apache那样有自动切割日志. 建立一个脚本文件,并保证这个文件有可执行的权限:1.建立一个文件/root/log.nginx.s ...
- IOS抓包工具paros的使用
一,环境安装,软件安装 1.下载安装java JDK for Mac,可以从Oracle官网下载(但是一般Oracle的都是最新的版本的),或者从苹果的开发者网站下载,我是从苹果官网下载的javafo ...
- linux配置使用外部smtp发送邮件
mail命令需要设定mail.rc(或nail.rc)文件, set from=user@domain.comset smtp=smtp.domain.comset smtp-auth-user=us ...
- 最简单的入门github
下载 git clone ***(地址) 上传 1. 先注册一个github账号 2.在github网站上建设一个工程 3. 把想要上传的数据上传到网站去 1 git config --glob ...