app token session rsp

 

引用:https://blog.csdn.net/jack85986370/article/details/51362278redis

 

1、登陸機制

粗略地分析, 登陸機制主要分爲登陸驗證、登陸保持、登出三個部分。登陸驗證是指客戶端提供用戶名和密碼,向服務器提出登陸請求,服務器判斷客戶端是否能夠登陸並向客戶端確認。 登陸認保持是指客戶端登陸後, 服務器可以分辨出已登陸的客戶端,併爲其持續提供登陸權限的服務器。登出是指客戶端主動退出登陸狀態。容易想到的方案是,客戶端登陸成功後, 服務器爲其分配sessionId, 客戶端隨後每次請求資源時都帶上sessionId。算法

simple_flow

1.1 登陸驗證

上述簡易的登陸驗證策略存在明顯的安全漏洞,須要優化。安全

 

1.1.1 密碼的傳輸

客戶端第一次發出登陸請求時, 用戶密碼以明文的方式傳輸, 一旦被截獲, 後果嚴重。所以密碼須要加密,例如可採用RSA非對稱加密。具體流程以下:服務器

  • 客戶端向服務器第一次發起登陸請求(不傳輸用戶名和密碼)。
  • 服務器利用RSA算法產生一對公鑰和私鑰。並保留私鑰, 將公鑰發送給客戶端。
  • 客戶端收到公鑰後, 加密用戶密碼, 向服務器發起第二次登陸請求(傳輸用戶名和加密後的密碼)。
  • 服務器利用保留的私鑰對密文進行解密,獲得真正的密碼。

1.1.2 登陸狀態token

再仔細覈對上述登陸流程, 咱們發現服務器判斷用戶是否登陸, 徹底依賴於sessionId, 一旦其被截獲, 黑客就可以模擬出用戶的請求。因而咱們須要引入token的概念: 用戶登陸成功後, 服務器不但爲其分配了sessionId, 還分配了token, token是維持登陸狀態的關鍵祕密數據。在服務器向客戶端發送的token數據,也須要加密。因而一次登陸的細節再次擴展。網絡

  • 客戶端向服務器第一次發起登陸請求(不傳輸用戶名和密碼)。
  • 服務器利用RSA算法產生一對公鑰和私鑰。並保留私鑰, 將公鑰發送給客戶端。
  • 客戶端收到公鑰後, 加密用戶密碼,向服務器發送用戶名和加密後的用戶密碼; 同時另外產生一對公鑰和私鑰,本身保留私鑰, 向服務器發送公鑰; 因而第二次登陸請求傳輸了用戶名和加密後的密碼以及客戶端生成的公鑰。
  • 服務器利用保留的私鑰對密文進行解密,獲得真正的密碼。 通過判斷, 肯定用戶能夠登陸後,生成sessionId和token, 同時利用客戶端發送的公鑰,對token進行加密。最後將sessionId和加密後的token返還給客戶端。
  • 客戶端利用本身生成的私鑰對token密文解密, 獲得真正的token。

login

1.2 登陸保持

在最原始的方案中, 登陸保持僅僅靠服務器生成的sessionId: 客戶端的請求中帶上sessionId, 若是服務器的redis中存在這個id,就認爲請求來自相應的登陸客戶端。 可是隻要sessionId被截獲, 請求就能夠爲僞造, 存在安全隱患。session

引入token後,上述問題即可獲得解決。 服務器將token和其它的一些變量, 利用散列加密算法獲得簽名後,連同sessionId一併發送給服務器; 服務器取出保存於服務器端的token,利用相同的法則生成校驗簽名, 若是客戶端簽名與服務器的校驗簽名一致, 就認爲請求來自登陸的客戶端。keep_login併發

 

1.3 TOKEN失效
用戶登陸出系統函數

失效原理:
在服務器端的redis中刪除相應key爲session的鍵值對。優化

2、 散列算法

散列是信息的提煉,一般其長度要比信息小得多,且爲一個固定長度。加密性強的散列必定是不可逆的,這就意味着經過散列結果,沒法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將致使散列結果的明顯變化,這稱之爲雪崩效應。散列還應該是防衝突的,即找不出具備相同散列結果的兩條信息。具備這些特性的散列結果就能夠用於驗證信息是否被修改。加密

散列算法能夠用來加密token生成簽名, 以便token信息不暴露在網絡同時還能驗證登陸的有效性。

2.1 md5

全寫: Message Digest Algorithm MD5(中文名爲消息摘要算法第五版)

輸出: 128bit

MD5算法具備如下特色:
一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
二、容易計算:從原數據計算出MD5值很容易。
三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
四、弱抗碰撞:已知原數據和其MD5值,想找到一個具備相同MD5值的數據(即僞造數據)是很是困難的。
五、強抗碰撞:想找到兩個不一樣的數據,使它們具備相同的MD5值,是很是困難的。

缺陷:
Md5一度被認爲十分靠譜。
2004年8月17日的美國加州聖巴巴拉的國際密碼學會議(Crypto’2004)上,來自中國山東大學的王小云教授作了破譯MD五、HAVAL-12八、 MD4和RIPEMD算法的報告,公佈了MD系列算法的破解結果。
2009年,馮登國、謝濤二人利用差分攻擊,將MD5的碰撞算法複雜度從王小云的2^42進一步下降到2^21,極端狀況下甚至能夠下降至2^10。僅僅2^21的複雜度意味着即使是在2008年的計算機上,也只要幾秒即可以找到一對碰撞。
Md5已老, 在安全性要求較高的場合,不建議使用。

2.2 sha1

全名: 安全哈希算法(Secure Hash Algorithm)
輸出: 160bit

2.2.1 與Md5比較

相同點:
由於兩者均由MD4導出,SHA-1和MD5彼此很類似。相應的,他們的強度和其餘特性也是類似。
不一樣點:
1. 對強行攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5摘要長32 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD5是2^128數量級的操做,而對SHA-1則是2^160數量級的操做。這樣,SHA-1對強行攻擊有更大的強度。
2. 對密碼分析的安全性:因爲MD5的設計,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊。
3. 速度:在相同的硬件上,SHA-1的運行速度比MD5慢。

2.3 加鹽

所謂加鹽, 就是在本來須要加密的信息基礎上,糅入其它內容salt。簽名的生成就是一次加鹽。

3、對稱加密

本系統使用對稱加密對用戶密碼進行加密以及生成token字符串。

3.1 AuthCode加密

AuthCode是康盛科技發明的加密方式, 開源產品Discuz的密碼是用這個算法進行加密。可是有點遺憾,這個函數全部權屬於康盛創想,並不能自由使用的。不知使用是否有風險??

3.2 AES加密

高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣爲全世界所使用。

4、非對稱加密

RSA是目前最有影響力的公鑰加密算法,它可以抵抗到目前爲止已知的絕大多數密碼攻擊,已被ISO推薦爲公鑰 數據加密標準。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。
算法描述:
(1)選擇一對不一樣的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e(公鑰指數),且1<e<f(n)。
(5)計算d(私鑰指數),使得de≡1 mod f(n)。這個公式也能夠表達爲d ≡e-1 mod f(n)
注,≡是數論中表示同餘的符號。
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,而後再進行交換。設密文爲C,則加密過程爲:
(8)解密過程爲:
相關文章
相關標籤/搜索