萬盛學電腦網

 萬盛學電腦網 >> 網絡應用技術 >> 本地存儲密碼的安全設計介紹

本地存儲密碼的安全設計介紹

  有些應用需要把用戶密碼保存在本地,本方案設計了一種較為安全的密碼本地存儲的方案。

  1 安全要求

  1.1 要實現的

  1.防止攻擊者得到用戶密碼的明文 防止攻擊者拿到自動登錄token後,一直都可以登陸 即使兩個用戶的密碼相同,服務器保存的密文密碼也不一樣 可在服務器端清除salt,讓用戶的自動登錄token失效,需手動登錄 用戶在多個終端登錄同一個帳號,各終端的自動登錄功能都生效

  1.2 不實現的

  1.更安全的方案能做到“把本地保存的文件復制到其他客戶端”登錄就會失效,這依賴於客戶端做處理,本方案不實現 有的方案采用RSA非對稱加密,本方案直接采用AES對稱加密

  2 APP場景分析

  2.1 注冊時A

  AesKey = 前後端約定好的密鑰 ClientSalt = 客戶端隨機生成8個字符(從0-9A-Za-z中選) HashedPassword = SHA1(明文密碼) EncryptedPassword = Base64(AesEncrypt(ClientSalt + HashedPassword, AesKey))說明:

  1.注冊時客戶端在注冊接口裡提交EncryptedPassword 服務器用AesKey解出ClientSalt + HashedPassword,因為ClientSalt固定22字節,能計算得到HashedPassword

  注冊成功後,服務器保存的用戶密碼是SavedPassword。生成方法如下:

  ServerSalt = 服務器隨機生成8個字符(從0-9A-Za-z中選) SavedPassword = Base64(AesEncrypt(ServerSalt + HashedPassword, 服務器專用密鑰))說明:

  1.有了ServerSalt,即使兩個用戶的密碼相同,最後的EncryptedPassword也會不一樣。 用戶密碼在數據庫中沒有明文存儲。

  2.2 手動登錄時

  說明:

  1、客戶端在手動登錄接口裡提交EncryptedPassword(生成方法同2.1注冊時)

  2、服務器驗證的過程:

  1) 用AesKey從客戶端的EncryptedPassword裡解出HashedPassword

  2) 用服務器專用密鑰從數據庫的SavedPassword裡解出HashedPassword

  3) 比較兩個HashedPassword

  4) 驗證成功後返給客戶端SaltExpire和AutoLoginToken,生成方式如下:

  Salt = 隨機8字符(從0-9A-Za-z中選) SaltExpire = 該Salt最後有效時間 AutoLoginToken = Base64(AesEncrypt(Salt + HashedPassword, 服務器專用密鑰))5) 把用戶ID、Salt和SaltExpire保存在Salt緩存表中

  3、客戶端本地存儲的是SaltExpire和AutoLoginToken,沒有保存明文密碼

  4、客戶端因為不知道服務器的Aes密鑰,無法解出HashedPassword

  2.3 自動登錄時

  1、客戶端先根據本地保存的SaltExpire來判斷是否已過期,過期需要手動登錄

  2、未過期時,客戶端在自動登錄接口裡提交AutoLoginToken

  3、服務器驗證的過程:

  1) 從AutoLoginToken解出Salt和HashedPassword

  2) 在Salt緩存表裡查詢該用戶ID的此Salt是否已過期

  3) 未過期的情況下對比兩個HashedPassword

  4) 驗證成功時,構造新的Salt、SaltExpire及AutoLoginToken,把SaltExpire和AutoLoginToken返回給客戶端

  5) 把用戶ID、新的Salt和SaltExpire保存在redis中,老的Salt清除掉

  4、客戶端更新本地存儲的SaltExpire和AutoLoginToken

  5、在出現風險需要用戶手動登錄時,可以把用戶的SaltExpire清零來實現

  2.4 多終端自動登陸的時間

  多終端在執行2.2手動登錄過程時,會生成多份Salt/SaltExpire,一個終端自動登錄後會產生新的Salt(老的那個Salt會清除掉),但不會影響另一個終端的自動登錄,因為用的Salt本來就不同。

copyright © 萬盛學電腦網 all rights reserved