密碼管理EasyPass開發筆記(第2篇)
EasyPass的後端框架
EasyPass採用golang作為後端語言。作為近今年比較火爆的語言,golang以它的高併發和開發快吸引了一大批優秀的開發者,EasyPass也正是看中了它的簡潔、高效和高效能。後端儲存EasyPass採用mongo,mongo是nosql的佼佼者,支援各種複雜的查詢,特別是4.0支援了事務後,發展迅猛。
EasyPass的後端主要負責加密資料的儲存,架構也是相對簡單,如下所示:

EasyPass後端架構圖
閘道器層負責藉口的限流和鑑權,業務層是具體業務邏輯,底層儲存是用的mongodb。
EasyPass的表結構
使用者的每一個密碼對於mongodb裡的一條資料,具體的資料結構如下所示:
{ "id": "資料的ID", "account": "資料所有者的帳號", “encrypted_data": "加密的資料", "version": "資料的版本號", "last_modify_time": "最後修改時間", "is_deleted": false, // 是否被刪除 }
其中,encrypted_data即為加密的資料,解密後是個json字串,它儲存了使用者的一條賬戶密碼資料。version是資料的版本號,每次使用者修改主密碼,這個值都會加一。
EasyPass後端保證使用者資料不丟失
為了保證使用者資料的不丟失,EasyPass後端有兩大設計:1、資料軟刪除;2、資料回滾技術;3、異地多活技術。
資料軟刪除
根據資料的表結構,資料的刪除其實就是把is_deleted欄位設定為true,如果使用者不小心刪除了密碼,可以給EasyPass發郵件,技術人員可以幫使用者恢復密碼。
資料回滾技術
使用者資訊的表結構如下所示:
{ "account": "使用者帳號", "version": "版本號", ... // 其它欄位 }
其中,版本號對應了使用者資料的版本號。因此每次取資料的過程如下:

取資料的過程
修改主密碼的過程如下:

修改主密碼流程
資料回滾的過程如下:

回滾資料流程
由此可知,使用者主密碼的歷史資料都是保留的,如果忘記密碼,使用者可以給EasyPass發郵件,將主密碼回滾到以前的某個版本。值得注意的是,資料回滾後,新主密碼下建立的密碼資訊就會失效(但是資料庫中任會保留),因此使用者在回滾請求資料的時候需要謹慎。
異地多活技術
傳統的單資料中心部署是不可靠的,因為如果硬碟損壞會帶來不可挽回的損失,EasyPass致力於保護使用者資料的100%可靠,引進了異地多活技術。目前EasyPass有華東和美西兩個節點,兩地資料非同步同步、互為主備。這不僅使得使用者資料不丟失,還使得無論使用者在國內還是國外,都能流暢自如地使用EasyPass。
EasyPass的原理是每次使用者增加或者修改資料後,都會啟動一個非同步任務。非同步任務會快速地將使用者資料向其它資料中心轉發,非同步任務的表結構如下:
{ "id": "任務ID", "account": "使用者帳號", "method": "介面名稱", "req": "請求資料", "user_info": "使用者資訊", ... }
非同步任務的原理是模擬使用者請求去依次呼叫其它資料中心節點的介面,從而實現了使用者資料的異地同步。
廣告時間(哈哈,允許我推廣一下我的密碼管理工具)
簡單專業的密碼管理EasyPass
官網地址: ofollow,noindex">https://www.easypass.tech
官方郵箱: [email protected]

EasyPass官網