一個有爭議的話題:客戶端密碼加密有必要嗎?

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERPCRMAI 大模型等等功能:
  • Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn
【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本 

和小夥伴們討論一個有爭議的話題:
  • 密碼加密需要在客戶端進行嗎?
有的人覺得密碼加密直接在服務端進行就可以了,沒必要在客戶端做;當然也有人覺得可以在客戶端進行密碼加密,降低伺服器的壓力。
你要問松哥專案中是怎麼做的,我會告訴你我們在客戶端就對密碼加密了。
為什麼這麼做呢?
我來和大家聊聊我們是怎麼考慮的。

一 燙手山芋

首先我們有一個共識,就是明文密碼是一個燙手山芋,是一個定時炸彈,應該儘早處理。
把這樣一個炸彈從前端運到後端再進行加密處理,似乎並非一個好的辦法。應該儘早對炸彈進行處理,然後再進行運輸。
那麼在客戶端就對密碼進行加密的目的是什麼?防止密碼在傳輸過程中洩露嗎?
顯然不是!
對於重放攻擊來說,人家壓根不 care 你是否在客戶端加密密碼,對於重放攻擊來說,密碼是否在客戶端進行加密,問題都不大。
什麼是重放攻擊? 重放攻擊(Replay Attack)是一種網路安全攻擊,攻擊者透過截獲並重新發送之前捕獲的資料包,以實現對系統的欺詐或破壞。這種攻擊通常發生在沒有正確實現訊息認證和完整性保護的系統中。 一般來說,重放攻擊有三個特點:
  1. 無需破解加密:攻擊者不需要知道加密演算法或金鑰,只需複製和重放資料包。
  2. 依賴於協議的缺陷:如果協議沒有設計好,沒有實現時間戳、序列號或一次性令牌等機制,就容易被重放攻擊。
  3. 可重複性:攻擊者可以多次重放相同的資料包,嘗試獲取相同的結果。
一般來說,解決重放攻擊比較有效並且省事的辦法就是上 HTTPS。
客戶端對密碼進行加密的目的是為了防止明文密碼在到達後端之後被濫用。這是最主要的目的。
為了增加破解成本,在前端進行加密的時候,可以使用慢 hash 函式。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 影片教程:https://doc.iocoder.cn/video/

二 什麼是慢 hash

慢雜湊函式(Slow Hash Function)是一種密碼學上的雜湊函式,它被設計成故意減慢處理速度,以增加破解的難度。
這種函式通常用於密碼儲存、金鑰派生和某些加密演算法中,目的是提供額外的安全層,防止暴力破解攻擊。
一般來說,慢雜湊函式主要有下面一些特點:
  1. 計算成本高 :故意設計成需要更多計算資源(CPU 時間或記憶體),使得暴力破解這種方式變得不切實際。
  2. 記憶體密集型 :許多慢雜湊函式需要大量的記憶體,這增加了並行處理的難度,因為每個雜湊計算例項都需要獨立的記憶體空間。
  3. 抵抗暴力破解 :由於計算成本高,慢雜湊函式使得暴力破解(嘗試所有可能的密碼直到找到匹配)變得非常困難。
  4. 鹽值(Salt) :慢雜湊函式通常與鹽值結合使用,鹽值是隨機生成的資料,用於與密碼組合,確保即使兩個使用者使用相同的密碼,他們的雜湊值也會不同。
  5. 金鑰延展(Key Stretching) :透過多次迭代雜湊過程,進一步增加破解難度。
常見的慢雜湊函式主要有如下幾種,這幾種也是我們在 Spring Security 中比較常見的:
  • PBKDF2(Password-Based Key Derivation Function 2) :使用 HMAC 作為偽隨機函式,可以配置迭代次數來增加計算時間。
  • BCrypt :專為密碼儲存設計,包含鹽值和多輪雜湊計算。
  • scrypt :設計用於加密貨幣和密碼儲存,特別強調記憶體密集型,以抵抗 GPU 和 ASIC 硬體加速的暴力破解。
  • Argon2 :是當前最推薦使用的慢雜湊函式之一,它贏得了密碼雜湊競賽(Password Hashing Competition),並被設計為抵抗各種型別的攻擊,包括定製硬體攻擊。
以 BCrypt 為例,如果我們控制 BCrypt 的執行時間大概是 0.1 秒完成一次雜湊計算的話,按照 1 秒生成 10 個雜湊值的速度,算完所有的 10 位大小寫字母和數字組成的弱密碼大概需要 P(62,10)/(3600×24×365×10)=1,237,204,169 年時間。
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/yudao-cloud
  • 影片教程:https://doc.iocoder.cn/video/

三 一次使用者註冊

瞭解了慢雜湊之後,我們來看一次完整的使用者註冊應該是什麼樣子的。
首先,使用者在客戶端輸入明文密碼 123。
接下來,客戶端對密碼進行加密,可以使用 SHA256 雜湊函式,如果想要謹慎一些,也可以使用使用者名稱等資訊作為鹽,以防止彩虹表的攻擊。
現在就可以由客戶端傳送密碼到服務端了。
服務端收到客戶端發來的訊息之後,在服務端眼裡可以將客戶端發來的密碼就當成明文,按照明文的處理流程進行加密並存儲,這塊松哥在 Spring Security 中和大家講過多次了,不贅述。
這就是使用者註冊的流程。
將來使用者登入其實也是一樣的。
使用者在客戶端輸入密碼之後,現在客戶端進行加密,然後再上傳到服務端,服務端再按照我們在 Spring Security 中講的方式進行處理就可以了。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章