JWT與RSA非對稱加密的原理及其在微服務中的應用

2021-09-24 04:20:43 字數 2095 閱讀 3764

5 rsa加密

目前我們建立了若干個微服務,假如我們在使用者中心做了登陸,接下來要去商品詳情頁新增商品,此時就要跳轉到購物車微服務,但是購物車微服務和使用者微服務不是同一臺tomcat,之前判斷登入狀態是通過tomcat session,通過儲存使用者資訊到tomcat session 中,那現在我們有兩台不同的tomcat,所以現在跳轉之後沒有登入狀態了,這顯然是不合理的,因為使用者資訊無法共享,所以之前所學的登入在分布式系統中是沒法使用的,那我們就來解決這個問題——無狀態登陸。

有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session

例如登入:使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後下次請求,使用者攜帶cookie值來,我們就能識別到對應session,從而找到使用者的資訊。

缺點是什麼?

微服務集群中的每個服務,對外提供的都是rest風格的介面。而rest風格的乙個最重要的規範就是:服務的無狀態性,即:

帶來的好處是什麼呢?

無狀態登入的流程:

流程圖:

整個登入過程中,最關鍵的點是什麼?

token的安全性

token是識別客戶端身份的唯一標示,如果加密不夠嚴密,被人偽造那就完蛋了。

採用何種方式加密才是安全可靠的呢?

我們將採用jwt + rsa非對稱加密

jwt,全稱是json web token, 是json風格輕量級的授權和身份認證規範(規定和規範了加密的規範但沒有實現,因此和語言無關),可實現無狀態、分布式的web應用授權;

jwt包含三部分資料:

我們會對頭部進行base64加密(可解密),得到第一部分資料

payload:載荷,就是有效資料,一般包含下面資訊:

這部分也會採用base64加密,得到第二部分資料

signature:簽名,是整個資料的認證資訊。一般根據前兩步的資料,再加上服務的的金鑰(secret)(不要洩漏,最好週期性更換),通過加密演算法生成。用於驗證整個資料完整和可靠性

流程圖:

步驟翻譯:

因為jwt簽發的token中已經包含了使用者的身份資訊,並且每次請求都會攜帶,這樣服務端就無需儲存使用者資訊,甚至無需去資料庫查詢,完全符合了rest的無狀態規範。

加密技術是對資訊進行編碼和解碼的技術,編碼是把原來可讀資訊(又稱明文)譯成**形式(又稱密文),其逆過程就是解碼(解密),加密技術的要點是加密演算法,加密演算法可以分為三類:

非對稱加密,如rsa

優點:安全,難以破解

缺點:演算法比較耗時

不可逆加密,如md5,sha

那光有jwt不就夠了嗎?為什麼還要rsa演算法,jwt也不是非要結合rsa演算法,md5加密理論上也是可以的,那為什麼非要學習rsa加密?

如果我們沒有rsa加密,只有jwt和md5(首先md5是不可逆加密,只能加密無法解密,而rsa可以加密也可以解密)那麼我們做登入是什麼樣子的?

在微服務架構中,我們可以把服務的鑑權操作放到閘道器中,將未通過鑑權的請求直接攔截,如圖:

注:我們把zuul加進來,因為zuul是整個後台微服務的入口,所有的請求都要先經過zuul才能到達特定的微服務,所以我們關於鑑權的流程沒有必要放在每乙個微服務做一次,這就太複雜了,我們放在入口zuul的位置,只需要做一次。

發現什麼問題了?

每次鑑權都需要訪問鑑權中心,系統間的網路請求頻率過高,效率略差,鑑權中心的壓力較大。

RSA非對稱加密原理

rsa加密屬於非對稱加密,即加密和解密是使用金鑰對中不同的秘鑰進行的。自己保留的為私鑰,公開的為公鑰,兩者都可以加密,但是只有使用另一者才能解密。rsa加密的金鑰對表示為 e,d,n e是單詞加密encryption的首字母,d是解密decryption的首字母,n是單詞數字number的首字母 r...

對稱加密與非對稱加密,以及RSA的原理

在現代密碼學誕生以前,就已經有很多的加密方法了。例如,最古老的斯巴達加密棒,廣泛應用於西元前7世紀的古希臘。16世紀義大利數學家卡爾達諾發明的柵格密碼,基於單錶代換的凱撒密碼 豬圈密碼,基於多表代換的維吉尼亞密碼,二戰中德軍廣泛使用的恩格瑪加密機 但最終都找到了有效的破解演算法。然而,在加密演算法之...

RSA非對稱金鑰加密原理

一 基礎數論 1 互質關係 2 尤拉函式 二 rsa加密 第一步,隨機選擇兩個不相等的質數p和q。愛麗絲選擇了61和53。實際應用中,這兩個質數越大,就越難破解。第二步,計算p和q的乘積n。愛麗絲就把61和53相乘。n 61 53 3233 n的長度就是金鑰長度。3233寫成二進位制是1100101...