美文网首页
初识Token&&Base64编码

初识Token&&Base64编码

作者: Jinxhao18 | 来源:发表于2018-12-11 00:47 被阅读0次

Token的产生

主要用于web端或者移动端身份验证,可简单理解为“令牌”、“身份证”,有了身份证明,就方便了出入一些隐秘场所的流程。
传统的身份验证是用户端发送账户、密码到服务器,经过加密后与数据库内存储的加密后的账号密码相比较,用户每次登录都要经过一次身份验证,可以说很麻烦。
解决方法就是Session,用户请求登陆时,身份验证成功后,服务器生成一条包含用户身份的记录,然后把该记录ID发给客户端,保存在cookie里。下次再次访问时,携带这条cookie,服务端验证cookie携带信息,如果能查询到ID对应记录,则验证通过,返回请求信息。
主要过程:

  1. 用户向服务器发送用户名和密码。
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
  3. 服务器向用户返回一个 session_id,写入用户的 Cookie。
  4. 用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
  5. 服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

问题是session要存储在后台,需要定期清理,而且多网站session共享没法实现。
出现问题就要解决啊,token就应运而生,它不需要再服务端存储信息。就像web端打开简书时会自动登录一样。

Token流程

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

Token实现之Json Web Token(JWT)

JWT分为三个部分:

  • Header (头部)
  • Payload (负载)也可以意译为数据,信息主要体
  • Signature(签名)
    完整的JWT为三部分用.相连,就像Header.Payload.Signature,当然各部分数据都是经过操作后组合在一起。
Header:一个json对象,描述jwt的元数据,说明书(需要经过Base64URL编码)
{
  "alg":"HS256"  //签名算法,默认为HS256,不加密为none
  "type":"JWT"  //令牌类型,jwt就是jwt
}
Payload:一个json对象,存放实际数据,真正的药方(Base64URL编码)

官方规定了7个官方字段,当然也可以自定义

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号

注意:jwt默认不加密,不要存放敏感数据,base64只是起到信息不被直接识别的作用

Signature:对前面两部分的签名,或者说盖章,防止数据被修改,此时需要定义一个密钥secret,保存在服务器端,不需要发送给客户端。

signature形式为

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
//将经过base64url编码后的header和payload用.相连

最后发送到客户端的Token
base64UrlEncode(header) +"."+base64UrlEncode(payload)+"."+signature


Base64

关于base64也是看token才去百度了一下,原理还是挺简单的,直接贴百度百科

原理
转码过程例子:
3 * 8(位)=>4 * 6(位)
计算机内存1个字节占8位,汉字两字节
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z

BASE64URL脱胎于base64,有一些小改变

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如api.example.com/?token=xxx)。
Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-/替换成_ 。这就是 Base64URL 算法。

Token练习

这篇博客中有个小demo可以拿来尝试下token的签发与验证。(Tips:使用博主推荐的安装与签发JWT的功能包jsonwebtoken时,不知到是不是被墙了还是别的原因会缺少一些模块导致程序运行失败,我用的最笨的方法,报错时说少哪个依赖我就安装哪个依赖,最后总会成功的)
参考博客中还有些更详细的信息和链接,有需要自行点击前往。

主要参考博客

相关文章

  • 初识Token&&Base64编码

    Token的产生 主要用于web端或者移动端身份验证,可简单理解为“令牌”、“身份证”,有了身份证明,就方便了出入...

  • PCM数据的采集和播放

    一、初识PCM 以下介绍来自百度百科 PCM 脉冲编码调制是Pulse Code Modulation的缩写。脉冲...

  • Mybatis入门学习(1)

    初识Mybatis 传统JDBC开发模式的痛点: 连接参数、SQL语句的硬编码 数据库的频繁连接与断开 查询结果集...

  • 01.Python基础-4.字符串

    1 字符串初识 字符串编码 字符串定义:多个字符(双引号或单引号中的数据)组成 字符串下标 类似列表list 格式...

  • 今日干货分享:架构师必学知识点,学完阿里腾讯不是梦

    初识架构设计 软件工程一般可分为需求、设计、编码、测试、部署、维护。既然架构设计是一个过程,那么就有输入和输出。架...

  • 第二节-初识python和字符编码

    内容编码 字符编码的发展 ascii (只能识别英文) 8位 = 01010101 2**8(2的8次方)= ...

  • mysql编码

    查看编码 查看数据库编码 查看表编码 查看字段编码 修改编码格式 修改数据库编码格式 修改表编码 修改字段编码

  • 编码

    编码 编码格式(ASCII编码,GB2312编码(简体中文),GBK,ANSI编码,unicode,utf-8编码...

  • 网络安全编码书目录

    网络安全编码 Base64编码 MD5编码 SHA1编码 SHA256编码 HMAC编码

  • 前端开发文档规范

    HTML 编码规范 请查看HTML编码规范 CSS 编码规范 请查看CSS编码规范 JavaScript 编码规范...

网友评论

      本文标题:初识Token&&Base64编码

      本文链接:https://www.haomeiwen.com/subject/nxjjhqtx.html