成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Web 安全 - 同事告訴我 JWT 是明文的...

安全 應用安全
JWT 由服務端生成可以存儲在客戶端,對服務端來說是無狀態的,可擴展性好。一旦 token 泄漏,任何人都可以使用,為了減少 token 被盜用,盡可能的使用 HTTPS 協議傳輸,token 的過期時間也要設置的盡可能短。

一天 “小張” 接到一個需求 “一旦用戶登陸認證成功之后,后續的請求可以攜帶一個令牌,無需再次身份認證”。

這時 “小張” 咨詢了資深搬磚工程師 “小李”,憑借多年的搬磚經驗,同事 “小李” 說到:HTTP 協議是無狀態的,在第一次登陸認證成功后,下一次請求時,服務器也不知道請求者的身份信息。通常有兩種實現方式:

  • 一種傳統的做法是在服務器上存儲用戶 session 信息,每次請求時攜帶 sessionID 進行驗證,這種方式缺點是會占用服務器內存,當用戶越來越多會增加服務器的內存開銷、由于存儲在內存還會帶來擴展性問題。
  • 第二種方法是采用 JWT 技術,它是一種無狀態的身份驗證。只做校驗,將用戶狀態分散到了客戶端,服務器端不會進行信息存儲。

“小張” 聽完后,連忙說到第二種聽著不錯哦,搜索了一些相關文章介紹之后就開始了愉快的代碼編寫。完成之后提交了代碼給同事 “小李” 做 code review,做為資深搬磚工程師的 “小李”,一眼看出了問題:“怎么能在 JWT 生成的 token 里放用戶密碼呢!JWT 默認是明文的,不能存儲隱私信息”。

“小張” 不解,反問道:怎么會是明文呢,加密之后的數據我看了的,是一堆亂碼啊,下面是打印的 token 信息。

// jwt 簽名后生成的 token
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IuW8oOS4iSIsInBhc3N3b3JkIjoxMjM0NTYsImlhdCI6MTY2MTg2OTQxMX0.3-60HUf_cKIo44hWUviNzqdUoUGngGQfrqffg0A6uqM"

“小李” 通過一段 Node.js 代碼展示了如何解密出 JWT 簽名后的 token 數據。

圖片

此時的 “小張” 陷入了沉思,頓時心里產生了兩個疑問???:

  • 簽名時使用了 secret 了,生成的 token 看著就是一串亂碼的字符啊,為什么是明文呢?
  • 按照上面這樣解析 token 中簽名的數據,數據會不會被篡改呢?

帶著這兩個疑問,下一步讓我們一塊了解下 JWT 的原理。

JWT 原理

JWT 全稱 JSON Web Token,是一種基于 JSON 的數據對象,通過技術手段將數據對象簽名為一個可以被驗證和信任的令牌(Token)在客戶端和服務端之間進行安全的傳輸。

JWT Token 由三部分組成:header(頭信息)、payload(消息體)、signature(簽名),之間用 .? 鏈接,構成如下所示:

圖片

Header 部分由 JSON 對象 ?{ typ, alg }? 兩部分構成,使用 base64url(header) 算法轉為字符串:

  • typ:表示令牌類型,JWT 令牌統一寫為JWT
  • alg:簽名算法,默認為HS256?,支持的算法為['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'HS256', 'HS384', 'HS512', 'none']

Payload 部分為消息體,用來存儲需要傳輸的數據,同樣也是一個 JSON 對象使用base64url(payload) 算法轉為字符串,JWT 提供了 7 個可選字段供選擇,也可以自定義字段:

  • iss (issuer):簽發人
  • exp (expiration time):過期時間
  • sub (subject):主題
  • aud (audience):受眾
  • nbf (Not Before):生效時間
  • iat (Issued At):簽發時間
  • jti (JWT ID):編號

Signature 是對 Header、Payload 兩部分數據按照指定的算法做了一個簽名,防止數據被篡改。需要指定一個 sceret,產生簽名的公式如下:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)

生成簽名后,將 header.payload.signature 三部分鏈接在一起,形成一個令牌(token)返回給客戶端。

問題答疑

這就是 JWT 的原理,了解之后并沒有那么神秘,回答上面的幾個問題。

簽名時使用了 secret,為什么是明文?

header、payload 部分是使用 base64 算法進行的編碼,并沒有被加密,自然也可以被解碼。但注意這里的 base64 算法有點不一樣的地方在于,token 可能會被放在 url query 中傳輸,URL 里面有三個特殊字符會被替換。下面是 JWT 中 base64url 的實現方式:

// https://github1s.com/auth0/node-jws/blob/HEAD/lib/sign-stream.js#L9-L16
function base64url(string, encoding) {
return Buffer
.from(string, encoding)
.toString('base64')
.replace(/=/g, '')
.replace(/\+/g, '-')
.replace(/\//g, '_');
}

還需要注意 payload 對象放置的內容越多,base64 之后的字符串就越大,同理簽名后的 token 也一樣。

數據會不會被篡改?

數據一旦被篡改,到服務端也會認證失敗的,服務端在生成簽名時有一個重要的參數是 secret,只要保證這個密鑰不被泄漏,就沒問題,就算篡改也是無效的。

Node.js 示例演示

在 Node.js 中使用 JWT 需要用到 jsonwebtoken 這個庫,API 很簡單,主要用到兩個方法:

  • sign():生成簽名
  • verify():驗證簽名
const crypto = require('node:crypto');
const jwt = require('jsonwebtoken');

const secret = crypto.createHmac('sha256', 'abcdefg')
.update('')
.digest('hex');

const payload = {
"username": "張三",
"password": 123456,
iat: 1516239022
};
const token = jwt.sign(payload, secret)
const result = jwt.verify(token, secret)

總結

JWT 由服務端生成可以存儲在客戶端,對服務端來說是無狀態的,可擴展性好。

上文我們也講了 JWT 中傳輸數據的 payload 默認是使用 base64 算法進行的編碼,看似一串亂碼,實則是沒有加密,因此不要將涉及到安全、用戶隱私的數據存放在 payload 中,如果要存放也請先自己進行加密。

一旦 token 泄漏,任何人都可以使用,為了減少 token 被盜用,盡可能的使用 HTTPS 協議傳輸,token 的過期時間也要設置的盡可能短。

防止數據被篡改,服務端密鑰(secret)很重要,一定要保管好。

責任編輯:武曉燕 來源: 編程界
相關推薦

2017-07-17 12:17:38

2018-03-26 09:05:18

CTO

2024-04-09 09:08:09

Kafka消息架構

2020-12-01 15:35:06

Web安全明文密碼漏洞

2025-04-08 09:40:00

DWD數據倉庫大數據

2018-01-03 08:31:43

前端開發圖標

2018-01-10 15:15:47

2018-05-28 06:53:36

信息安全證書信息安全認證

2025-02-03 22:07:43

2021-11-10 11:46:49

《魷魚游戲》網絡安全安全觀察

2013-08-30 13:35:14

項目團隊

2013-08-05 10:19:34

小時代電影大數據

2013-11-11 11:10:03

WE大會馬化騰

2009-06-12 13:59:04

2021-11-01 07:00:32

IP字符串數據

2020-11-20 16:13:01

Android手機上網

2021-05-22 06:56:18

OpenWrt 路由器刷機

2024-09-03 09:20:45

2021-05-12 10:19:21

CPU程序運維

2013-04-26 17:48:04

WWDC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产aⅴ成人精品无吗 亚洲精品久久久一区二区三区 | 亚洲小说图片 | 日韩美女在线看免费观看 | 国产精品久久久久久久久久 | 91av免费版 | 亚洲播放 | 久久久久综合 | 国产成人久久av免费高清密臂 | 成人国产午夜在线观看 | 日韩一区二区三区av | 国产乱码精品一区二区三区av | 日韩一区精品 | 日韩精品一区二区三区中文在线 | 日日夜夜操天天干 | 在线成人| 精品一区二区在线观看 | 精品国产乱码久久久久久88av | 午夜午夜精品一区二区三区文 | 日韩另类视频 | 国产成人精品一区二区三区四区 | 亚洲精品乱码久久久久久按摩 | 久久久久久久久综合 | 精品一区二区三 | h视频在线免费观看 | 国产高清在线 | 欧美在线一区二区三区 | 在线一级片 | 亚洲一区播放 | 国产成人精品免费视频大全最热 | 色小姐综合网 | 日韩精品在线一区 | 午夜精品一区二区三区在线观看 | 欧产日产国产精品v | 成人午夜视频在线观看 | 最新伦理片| 精品99在线 | www.五月婷婷.com | 九九热在线视频观看这里只有精品 | 亚洲欧美国产精品久久 | 日韩电影免费在线观看中文字幕 | 欧美精品v |