技术分享
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)

鑫生活

总有人要赢,为什么不能是我
首页
  • JavaScript

    • 构造函数和原型
    • Cookie和Session
    • Object.create(null)和{}
    • TypeScript配置
    • typescript入门到进阶
  • 框架

    • Vue-Router
    • React基础入门
  • 其它

    • Http协议
    • 跨域问题总结
  • 分析Promise实现
  • Axios源码分析
  • Webpack原理
  • vueRouter源码分析
  • Vue

    • Vite快速搭建Vue3+TypeScript项目
    • Cordova打包Vue项目的问题
    • Vue将汉字转为拼音,取出首字母
  • JavaScript

    • new Function
  • 后端

    • Node.js中使用Crypto生成Token
    • Body-Parser处理多层对象的问题
  • 其它

    • 项目Demo汇总
    • Vuepress+Vercel搭建个人站点
    • 项目中能用到的
    • husky规范代码提交
  • Mongoose基础
  • Multer文件上传中间件的使用
  • JavaScript

    • 浅谈两数全等
    • JavaScript进制转换
    • 手写bind,apply,call和new
  • 算法

    • 数组去重和排序
    • 数组扁平化
    • 斐波那契数列
  • JavaScript 数据结构
  • 其它

    • webpack面试题
    • vite面试题
    • svg和canvas的优缺点
    • TypeScript面试题
    • Vue常见面试题
  • 计算机网络

    • 数据链路层
    • 网络层
  • Git的使用
  • Nginx的使用
  • CentOS7安装Nginx
  • 正则表达式
  • SEO搜索引擎优化
  • Serverless介绍
友链
GitHub (opens new window)
  • 项目 Demo 汇总
  • node中使用crypto生成token
    • crypto 安装
    • crypto 使用
      • 完整项目地址
      • 创建 token
    • 获取 token 信息
    • 检验 token 是否过期
  • new Function
  • body-parser处理多层对象的问题
  • Vite快速搭建Vue3+TypeScript项目
  • Cordova打包Vue项目的问题
  • Vue将汉字转为拼音,取出首字母
  • 项目中能用到的
  • Vuepress+Vercel搭建个人站点
  • husky规范代码提交
  • 项目
coderly
2019-12-12

node中使用crypto生成token

# node 中使用 crypto 生成 token

参考:https://www.jianshu.com/p/109ed0006e2f

# crypto 安装

  • npm install crypto-js

# crypto 使用

# 完整项目地址

  • 可以访问我的 gitbub项目:(趣学)https://github.com/coderlyu/quxue
  • 该项目的 server 文件夹就是 express 搭建的服务器
  • 里面的 utils 文件夹下的 token.js 就是 token 生成和验证的地方
  • 具体如何使用,可以找到用户登录的地方,返回结果有 生成token 的使用
  • 在需要验证 token 的地方,使用了自定义中间件,位于 utils 文件夹的 index.js 里面的 autotoken 方法

# 创建 token

const secret = "coderly.cn";
createToken: function (payload) {
    let obj2 = {
      data: payload, // payload
      created: parseInt(Date.now() / 1000), // token生成的时间的,单位秒
      // exp: parseInt(timeout) || 10 // token有效期 单位是秒
      exp: 7 * 24 * 60 * 60 // 7天过期
    };
    // payload信息
    let base64Str = Buffer.from(JSON.stringify(obj2), "utf8").toString(
      "base64"
    );
    // 添加签名,防篡改
    let hash = crypto.createHmac("sha256", secret);
    hash.update(base64Str);
    let signature = hash.digest("base64");
    return base64Str + "." + signature;
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

【说明】

  • 传入的 payload 参数就是我们需要加密的 内容,比如说我们可以将用户账号、密码作为 payload 加密到token里面,这样我们解密的时候就可以直接获取到用户的信息,来验证是否存在该用户以及该用户是否有权限访问等信息
  • 我使用的是 hmac(密钥哈希),所以我们需要一个密钥, 在这里是 secret 存储的字符串
  • let hash = crypto.createHmac("sha256", secret); 表示创建一个 hmac 密钥哈希,它需要传入两个参数,第一个参数使用 sha系列加密,它可以是 SHA-1 : sha1、SHA-2: sha256、SHA-1: sha512,SHA-1 已经被破解,SHA-3 应用较少,目前应用广泛相对安全的是 SHA-2 算法,所以本次讲的是 SHA-2;第二个参数是加密的 密钥
  • hash.update(base64Str); 表示 需要加密的内容是 base64Str
  • hash.digest("base64"); 表示字符编码是 base64,如果不设置,默认字符串编码为 UTF-8

# 获取 token 信息

const secret = "coderly.cn";
 decodeToken: function (token) {
    let decArr = token.split(".");
    if (decArr.length < 2) {
      // token不合法
      return false;
    }
    let payload = {};
    // 将payload json字符串 解析为对象
    try {
      payload = JSON.parse(Buffer.from(decArr[0], "base64").toString("utf8"));
    } catch (e) {
      return false;
    }
    // 检验签名
    let hash = crypto.createHmac("sha256", secret);
    hash.update(decArr[0]);
    let checkSignature = hash.digest("base64");
    return {
      payload: payload,
      signature: decArr[1],
      checkSignature: checkSignature
    };
  },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 检验 token 是否过期

 checkToken: function (token) {
    let resDecode = this.decodeToken(token);
    if (!resDecode) {
      return false;
    }
    // 是否过期
    let expState =
      parseInt(Date.now() / 1000) - parseInt(resDecode.payload.created) >
      parseInt(resDecode.payload.exp)
        ? false
        : true;
    if (resDecode.signature === resDecode.checkSignature && expState) {
      return true;
    }
    return false;
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#Node.js
上次更新: 2021/09/13, 15:11:59
项目 Demo 汇总
new Function

← 项目 Demo 汇总 new Function→

最近更新
01
css
09-13
02
html
09-13
03
README
09-13
更多文章>
Theme by Vdoing | Copyright © 2021-2021 coderly | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式