1. 程式人生 > >關於token、簽名、加密的一點理解

關於token、簽名、加密的一點理解

在之前的工作中,總是接觸到這些概念,之前都是零散的理解,在此總結下,以方便以後查閱

一、token 

在網站、app與伺服器互動的過程中,很多時候為了:

1、避免使用者多次輸入密碼

2、實現自動登陸

3、避免在終端直接儲存使用者的密碼

4、標示客戶端的請求是否合法

5、其他(暫時沒想到)

我們需要引入token機制,基於Token的驗證流程一般是這樣的:

  1. 客戶端使用使用者名稱跟密碼請求登入
  2. 服務端收到請求,去驗證使用者名稱與密碼
  3. 驗證成功後,服務端會簽發一個 Token,這個Token是與使用者名稱一一對應的,token一般可以儲存在快取或資料庫中,以方便後面查詢出來進行驗證。再把這個 Token 傳送給客戶端
  4. 客戶端收到 Token 以後可以把它儲存起來,比如放在 Cookie 裡或者 Local Storage 裡
  5. 客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 Token
  6. 服務端收到請求,然後去驗證客戶端請求裡面帶著的 Token,如果驗證成功,就向客戶端返回請求的資料
Token存在過期時間,在Token生成的時候可以打上一個時間戳,驗證token的時候同時驗證是否過期,並告知終端。終端接收到token過期的返回後,則要求使用者重新輸入使用者名稱跟密碼,進行登入。

使用者的一些操作需要從新請求服務端下發token,如退出、修改密碼後重新登入。

二、加密解密

在客戶端與伺服器進行互動時,必然涉及到互動的報文(或者通俗的講,請求資料與返回資料),如果不希望報文進行明文傳輸,則需要進行報文的加密與解密。

所以加密的主要作用就是避免明文傳輸,就算被截獲報文,截獲方也不知道報文的具體內容。

我在平時用的比較多的加密演算法主要是對稱加密中的3DES加密與非對稱加密中的RSA。對於這2個加密演算法的用法,可自行google。

三、簽名

為什麼要簽名?

1、在客戶端與伺服器進行互動時,報文雖然加密了,但我們並不能確認這個報文是誰發過來的。例如,與第三方伺服器B進行互動時,我方收到了一個已加密的請求,但我方並不能確認是伺服器B傳送的這個報文,此時我們可以用數字簽名的方式來進行驗證。作用:認證資料來源 

2、如果我方收到一個B伺服器簽名的請求,那麼B伺服器也無法否認這個請求,因為帶有它的簽名,作用:抗否認性。

3、我方收到一個B伺服器簽名的請求,但我方並不能確認這個請求是否被篡改過(雖然報文加了密,也可能被篡改),此時即可用簽名,驗證簽名中的報文與傳過來的報文是否一致。作用:保證了資料的完整性

平時工作中用的最多的簽名演算法是:RSA。

遵循規則:公鑰加密,私鑰解密

總結:在實際開發工作中應該 先通過web filter 解密,解密後進行驗證簽名(返回資料時,過程反過來,先簽名再加密);然後再springmvc的Interceptor 中進行驗證token