認證與會話管理

認證與會話管理

認證和授權是兩個事情,認證是爲了認出用戶是誰,授權是爲了決定用戶可以做什麼。

密碼認證

密碼是最簡單編輯的認證方式,但也是最容易被突破的方式。適當增加密碼的長度 / 密碼字符的複雜度以及排除簡單字符組合,可以有效加強密碼強度。

密碼保存一般採用不可逆的加密算法,或者是單向散列函數算法加密後放到數據庫中。但是這樣還是有可能被黑客使用 "彩虹表" 的方法破譯。

彩虹表的策略是收集儘可能多的密碼原文和加密值的對應,根據這樣的鍵值對去匹配就好了,應對這樣的破譯最好的方法就是加一個 salt。

slat 就是在加密密碼的時候加上一個隨機的字符串,只要這個隨機的 salt 不被竊取, 破譯就是非常困難的。即便被竊取, 彩虹表也需要根據 salt 來調整。

多因素認證

除了支付密碼外,手機動態口令 / 數字證書 / 第三方證書甚至刷臉 / 指紋等都可以作爲用戶認證的手段

Session 認證

密碼和證書等認證只能用在登錄的時候,登錄後就需要使用 SessionID 來認證,常見的做法是把 sessionId 放到 cookie 中。因爲 cookie 會隨着 http 請求發送, 並且受到同源策略的保護

sessionID 是用戶登錄後的唯一憑證,一旦被黑客使用 XSS 等方式竊取後,就可以僞裝成用戶來完成一系列操作

Session Fixation

簡單來說就是 X 先獲取一個未認證的 seesionID, 然後把這個 id 給 Y,Y 去完成認證後,X 就是使用這個 sessionID 來僞裝成 Y 操作了

最關鍵的核心是服務器在 Y 完成認證後,並沒有去更新 Y 的 sessionID,所以只要我們在用戶登錄後,重寫 SessionId,就可以有效的避免這個問題.

單點登錄 (SSO)

單點登錄希望用戶只需要登錄一次,就可以訪問所有的系統

它的優點在於風險集中,只需要保護好一個點就行, 缺點在於風險太高,一旦被攻破,後果很嚴重

比較流行的是 OpenId

訪問控制

權限控制,抽象的說,就是某個主體需要實施某種操作,而系統對這種操作的限制就是權限控制

垂直權限管理

訪問控制實際上建立用戶和權限之間的對應關係,下面我們介紹一種基於角色的訪問控制 (Role-Base Access Control) RBAC

簡單來說就是一個系統會定義不同的角色,不同的角色有不同的權限,系統中的用戶會被分配多個不同的角色從而獲得不同的權限. 系統在驗證權限的時候,只需要驗證角色就可以了。

常見的如 Spring Security 提供基於 url 和基於 method 的控制

不同的角色權限有高低之分,高權限訪問低權限是可以的,低的訪問搞的是被禁止的。如果低的獲取了高的權限, 則發生了 "越權訪問"

配置權限, 應當遵循最小權限原則,並且使用 默認拒絕 的策略

水平權限管理

相對於垂直權限管理來說,水平權限問題出在同一個角色上,系統只驗證了能訪問數據的角色,而沒有對角色的用戶做細分,也沒有對數據子集做細分,因此缺乏一個用戶到數據的映射關係。由於水平權限管理是系統一個數據級的訪問控制造成的,所以水平權限管理又稱爲 基於數據的訪問控制。

OAuth

OAuth 解決授權問題,OpenId 解決認證問題

OAuth 允許用戶在不將第三方網站的用戶密碼暴露的情況,授權其他網站使用第三方的數據

密碼

密碼系統的安全性應該依賴於祕鑰的複雜性,而不是算法的保密性。

密碼管理最常見的錯誤, 就是把祕鑰硬編碼在代碼裏,同樣的,將加密祕鑰 / 簽名的 salt 等 "key" 硬編碼在代碼中,是很不好的習慣。

硬編碼的祕鑰可能通過以下方式泄露:

常見的管理辦法是將祕鑰保存在配置文件或者數據庫中,能接觸到配置文件和數據庫的人要越少越好, 權限控制要格外注意。

發佈到生產環境的時候,需要生產新的密碼或密碼

source:https://www.yuque.com/heyuqing/hgukev/ihmsxo

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3-3hEH4KDBaVsdYd4c1KSw