Token生成算法詳解

一、生成Token算法

Token(令牌)生成是一種驗證用戶身份的方法,通常用於保證API接口的安全性。Token生成算法可以採用多種方式,其中JWT(Json Web Token)是廣泛使用的一種。

二、Token生成

Token生成通常分為以下兩個步驟:

1、生成一個含有必要信息的JSON對象,如用戶id、用戶名以及過期時間等。

{
  "userId": "123456",
  "username": "john",
  "exp": 1627074891
}

2、將JSON對象進行簽名,生成最終的Token字符串,如下所示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjcwNzQ4OTF9.kSuq7xyQbUXZQNP3AnXlcZxTtCMVJHJGUJQjcBOpP8M

Token中包含了頭部、載荷和簽名三部分。其中,頭部指定了簽名算法,載荷包含了必要信息,簽名通過頭部和載荷計算而來。

三、生成算法的步驟是

1、將頭部和載荷進行Base64編碼,並將編碼後的字符串用”.”連接起來,形成一個未簽名的Token字符串。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjcwNzQ4OTF9

2、使用密鑰對未簽名的Token字符串進行簽名。簽名算法可以採用HMAC-SHA256等。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

3、將簽名結果用”.”連接到未簽名的Token字符串後面,形成最終的Token字符串。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImpvaG4iLCJleHAiOjE2MjcwNzQ4OTF9.kSuq7xyQbUXZQNP3AnXlcZxTtCMVJHJGUJQjcBOpP8M

四、服務端Token生成算法

服務端Token生成算法通常採用JWT。

在實現服務端Token生成算法時,需要定義Token的有效期、密鑰以及加密方式等參數,如下所示:

const jwt = require('jsonwebtoken')
const secret = 'my_secret_key'
const expiresIn = '2h'

function generateToken(payload) {
  const token = jwt.sign(payload, secret, { expiresIn })
  return token
}

以上實現了一個簡單的Token生成方法,通過傳遞payload參數即可生成Token字符串。

五、登錄Token生成算法

登錄Token生成算法是指在用戶登錄成功後,生成一個Token用於驗證用戶身份。

登錄Token生成算法通常包含以下步驟:

1、驗證用戶身份,驗證成功後生成一個JSON對象,包含用戶id、用戶名以及過期時間等信息。

const user = {
  userId: '123456',
  username: 'john',
  exp: Math.floor(Date.now() / 1000) + (60 * 60)
}

2、將JSON對象轉換成Token字符串,並返回給客戶端。

const token = generateToken(user)
res.json({token})

六、隨機數生成算法

隨機數生成算法通常用於生成密鑰、鹽以及Token中的nonce等。

Node.js內置了crypto模塊,提供了豐富的加密算法以及隨機數生成方法,如下所示:

const crypto = require('crypto')
const secret = crypto.randomBytes(16).toString('hex')

以上代碼使用了crypto.randomBytes方法生成了一個16字節的隨機數,並將其轉換成了hex字符串。

七、登錄令牌Token生成算法

登錄令牌Token生成算法可以用於生成用於用戶身份驗證的Token。

通常採用JWT方式實現,以服務端生成的令牌為例,其生成方法可如下:

const jwt = require('jsonwebtoken')
const secret = 'my_secret_key'
const expiresIn = '30d'

function generateLoginToken(user) {
  const payload = {
    subject: user.id,
    iat: Math.floor(Date.now() / 1000),
    exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 30),
    alg: 'HS256'
  }
  const options = {
    expiresIn: expiresIn
  }
  const token = jwt.sign(payload, secret, options)
  return token
}

八、Token生成原理

Token生成原理是採用了JWT規範,由頭部、載荷以及簽名三部分構成,經過base64編碼形成Token字符串。

其中,Payload中保存了用戶信息、過期時間等數據,用於驗證用戶身份。

簽名則是通過加密算法將頭部和載荷計算出的簽名值,用於保證Token在傳輸過程中不被篡改。

九、Token簽名算法

Token簽名算法通常採用HMAC-SHA256等加密算法,用於對Token進行加密。

const crypto = require('crypto')

function sign(payload, secret) {
  const header = {
    alg: 'HS256',
    typ: 'JWT'
  }
  const encodingHeader = base64UrlEncode(JSON.stringify(header))
  const encodingPayload = base64UrlEncode(JSON.stringify(payload))
  const signature = crypto.createHmac('sha256', secret).update(encodingHeader + "." + encodingPayload).digest('base64')
  return encodingHeader + '.' + encodingPayload + '.' + signature
}

以上代碼演示了如何使用HMAC-SHA256算法對Token進行簽名。

十、Token加密算法

Token加密算法通常採用AES等算法,用於保證Token在傳輸中的安全性。

const crypto = require('crypto')

function encrypt(text, secret) {
  const iv = crypto.randomBytes(16)
  const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(secret), iv)
  let encrypted = cipher.update(text)
  encrypted = Buffer.concat([encrypted, cipher.final()])
  return iv.toString('hex') + ':' + encrypted.toString('hex')
}

function decrypt(text, secret) {
  const parts = text.split(':')
  const iv = Buffer.from(parts[0], 'hex')
  const encryptedText = Buffer.from(parts[1], 'hex')
  const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(secret), iv)
  let decrypted = decipher.update(encryptedText)
  decrypted = Buffer.concat([decrypted, decipher.final()])
  return decrypted.toString()
}

以上代碼實現了AES加密算法的加密和解密方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/240244.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:21
下一篇 2024-12-12 12:21

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • JWT驗證Token的實現

    本文將從以下幾個方面對JWT驗證Token進行詳細的闡述,包括:JWT概述、JWT驗證Token的意義、JWT驗證Token的過程、JWT驗證Token的代碼實現、JWT驗證Tok…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python回歸算法算例

    本文將從以下幾個方面對Python回歸算法算例進行詳細闡述。 一、回歸算法簡介 回歸算法是數據分析中的一種重要方法,主要用於預測未來或進行趨勢分析,通過對歷史數據的學習和分析,建立…

    編程 2025-04-28

發表回復

登錄後才能評論