⑴ Spring boot-手把手教你使用Token
JWT由三部分組成,由類型和加密演算法的head(頭部),包含公共信息和自定義信息的playboard(負載),以及signature(簽名)組成。
就是頭部信息,這是由base64加密後的密文,base64是一種對稱加密演算法,解密後的json格式如下。頭部信息由type(類型)和 alg(加密演算法)組成。類型就是"JWT",加密演算法一般使用 HMAC SHA256加密演算法。
0 就是負載信息,加密後的json格式如下。負載信息一般由標准申明,公共聲明,私有聲明組成。
iss: jwt簽發者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大於簽發時間
nbf: 定義在什麼時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而迴避重放攻擊。
公共的聲明和私有的聲明可以添加任何的信息,一般添加用戶的相關信息或其他業務需要的必要信息。但不建議添加敏感信息,因為該部分在客戶端可解密。
第三部分簽名是由base64加密後的頭部信息和負載信息以及secret組成的簽名,簽名演算法是有頭部信息定以的加密演算法,一般是HMAC SHA256。然後頭部,負載,簽名三部分組成了token。
pom.xml引入依賴
新增controller,提供token介面
CallbackService 生成token
返回的示例如下
定義自定義註解,在需要token校驗的方法上加上即可
新增AuthenticationInterceptor對第三方請求進行攔截,實現HandlerInterceptor介面
注冊AuthenticationInterceptor攔截器,對指定請求路徑進行攔截
在此文中,我們大致了解了Token的定義,獲取,校驗等方法。此外,Token 的無狀態,可擴展性,多平台跨域等特性,也讓Token廣泛應用在安全校驗領域中。在接下來的幾篇文章中,我將介紹如何使用Spring AOP進行加密,解密,驗簽等操作。
參考:
https://www.jianshu.com/p/576dbf44b2ae
⑵ 令牌桶(Token Bucket)
想像有一個木桶,系統按照固定速率,例如10ms每次,往桶里加入Token,如果桶已經滿了就不再添加。新請求來臨時,會各自拿走一個Token,如果沒有Token 就拒絕服務。這里如果一段時間沒有請求時,桶內就會積累一些token,下次一旦有突發流量,只要token足夠,也能一次處理。
總結下令牌桶演算法的特點,令牌桶即可以控制進入系統的請求請求量,同時允許突發流量。
在秒殺活動中,用戶的請求速率是不固定的,這里我們假定為10r/s,令牌按照5個每秒的速率放入令牌桶,桶中最多存放20個令牌,那系統就只會允許持續的每秒處理5 個請求,或者每隔4 秒,等桶中20 個令牌攢滿後,一次處理20個請求的突發情況,保證系統穩定性。
go簡易版實現
⑶ onetime token是什麼意思
onetime token
一次性令牌
Token (計算機術語)
在計算機身份認證中是令牌(臨時)的意思,在詞法分析中是標記的意思。
⑷ 哪位大神能講下OAuth2.0 token生成演算法
1、HMACSHA1的概念
HMACSHA1 是
從 SHA1 哈希函數構造的一種鍵控哈希演算法,被用作 HMAC(基於哈希的消息驗證代碼)。此 HMAC
進程將密鑰與消息數據混合,使用哈希函數對混合結果進行哈希計算,將所得哈希值與該密鑰混合,然後再次應用哈希函數。輸出的哈希值長度為 160
位,可以轉換為指定位數。
上面是微軟的標準定義,我看了也沒太明白,他的作用一句話來理解:就是確認請求的URL或者參數是否存在被篡改,以QQ
簽名為例:發送方(自己)將參數等進行HMAC演算法計算,將得到的哈希值(即簽名值)與請求的參數一同提交至接收方(QQ端),然後接收方再次將參數等值
進行HMAC演算法計算,將得到的哈希值與你傳遞過來的哈希值進行核對驗證,若一樣,說明請求正確、驗證通過,進行一下步工作,若不一樣,將返回錯誤。
(下面說的夠詳細了吧,還不理解,留言給我)
2、QQ OAuth 1.0中用到的哈希演算法
/// <summary>
/// HMACSHA1演算法加密並返回ToBase64String
/// </summary>
/// <param name="strText">簽名參數字元串</param>
/// <param name="strKey">密鑰參數</param>
/// <returns>返回一個簽名值(即哈希值)</returns>
public static string ToBase64hmac(string strText, string strKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));
byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));
return System.Convert.ToBase64String(byteText);
}
或者寫成,原理一樣:
public static string HMACSHA1Text(string EncryptText, string EncryptKey)
{
//HMACSHA1加密
string message;
string key;
message = EncryptText;
key = EncryptKey;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
return ByteToString(hashmessage);
}
前面都注釋了參數含義,就不再說明了。COPY就可使用
註明:頁面請引用
using System.Security.Cryptography;
3、介紹另外一種HMACSHA1演算法的寫法
public static string HMACSHA1Text(string EncryptText, string EncryptKey)
{
//HMACSHA1加密
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(EncryptKey);
byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(EncryptText);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
}
⑸ token什麼意思 前端如何使用token
大家好,從網上找了很多關於token的文章,都是提到要生成一個token,然後前端每次請求的時候,要使用這個token,請問下如何在前端使用生成的token?
前端能就使用jQuery搞定,還是需要其他的前端框架配合?能有這方面的完整示例嗎?
做後端的,對前端的東西有些不太懂,請見諒
先謝謝大家了!!
解決方案1:
一般是後端有個結構給你拿token的,然後你請求的時候,根據約定
把token
放在header中
放uri參數中
放body表單里
給後端
解決方案2:
因為http協議是無狀態的 token是後台給你發的一個唯一標識 你再去訪問後台時帶上這個token 後台就知道你是誰了
同session的作用
解決方案3:
前台生成的token,可能會存在安全性問題吧
解決方案4:
你做後台應該很了解token才對呀。
用戶登錄後,生成一個session_id,即token,可以存在redis里。然後前端或客戶端保存起來,存cookie或者LS都行,然後所有的請求作為基類參數帶上(也有通過cookie帶的),然後server端再取到後,驗證你是不是你。
解決方案5:
使用領域很多,以表單為例子:
後台生成token.
前端列印表單,並且講該token變成隱藏項。<input type="hide" value="{{token}}">
客戶提交表單。
後台驗證提交的token合法性。
驗證成功,處理表單。驗證失敗,返回錯誤處理頁面。
解決方案6:
token一般都是後端生成的,在登陸之後返回,前端保存token,之後每次請求都帶上token來驗證身份。
解決方案7:
問題是前端生成的token給後台有用嗎
解決方案8:
一般token都是伺服器端生成,做csrf的。我在補充下我見過前端生成的栗子,雖然沒啥卵用,但讓我廢了好大的勁才發現。
譬如你有一個驗證碼的表單,你在傳遞驗證碼的時候,新增一個隱藏域,將驗證碼用你本地的js加密後,作為參數傳遞,這樣在伺服器端可以檢測驗證碼是不是被篡改過。
但這樣沒啥卵用,因為在提交的時候用同樣的js模擬即可。
解決方案9:
大多數情況下,token作為一種令牌,都是在伺服器端生成,生成的方法很多,從簡單點的對時間或者id或者兩個混合起來進行哈希運算的值到自己設計更復雜的演算法都可以,生成的目的是為了給前端下一次通信時使用這個token作為令牌,當作為一個請求資源的許可的標識,而伺服器則會視這個token在一段時間內都是有效的,並且還可以額外看情況加上是否是同一個ip之類的其它的限制,從而防止某種資源被非法訪問
偶有前端(包括本地客戶端或者app)生成token的情況是已經約定好了一個好的加密機制,伺服器可以信任客戶端的這個輸入的情況下可以由前端或者客戶端生成