不依賴於微信等第三方的掃描登錄系統

背景

掃描登錄很安全,但基本上大家用的都是基於微信的,需要到開發平臺申請。
對於大量的內部系統,比如流程管理系統、企業內部郵箱、各種管理後臺,目前大家基本都採用密碼登錄,相對外面的網站員工在公司內部網站更會用弱密碼。
內部系統弱口令的危害很大:資料泄漏、後臺權限,而且內部系統往往校驗少,更可能被webshell提權。

產品說明

在這樣的背景下我一直在琢磨做一個開源的項目,正好我又有些密碼學背景,這個項目目前開始動工了,如果符合大家需求希望踊躍留言,我更有動力做下去。

功能

  1. 最主要當然是實現安全的掃描登錄,用什麼掃?微信掃(調微信小程序)、或者app。我會提供小程序和跨平臺的app,ios已上架。
  2. 網站自助接入,不需要任何第三方開通,並且網站接入難度很低
  3. 支持開放註冊式的網站,也支持不開放註冊的網站
  4. 目前只支持pc網站,後續可能會做app的授權登錄

驗證流程

  1. 網站接入時生成一對公私鑰
  2. 網站登錄頁面使用sdk生成一個二維碼,二維碼中包含:一段短時間內唯一的隨機數據data+時間戳+網站公鑰+網站信息(站點名等)+ 授權後app會回調的url+使用網站私鑰對前面的信息進行簽名,對於不開放註冊網站在url裏帶上分配給用戶的身份id
  3. app掃描二維碼後,先驗證二維碼的簽名,再比對站點信息和公鑰是不是在本地已經存在,存在直接到第4步,不存在就走第一次綁定流程(對開發註冊站點叫註冊),記錄下站點信息+站點公鑰,並生成一對客戶端公私鑰保存
  4. 使用客戶端私鑰對二維碼中的隨機數據簽名得到sign+時間戳+再加上app的公鑰+用戶信息(暱稱頭像等)=data,再使用網站公鑰對data進行加密,將加密後的數據附帶在第一步的授權回調url中,訪問url。
  5. 網站收到第4步的數據後,先使用自己的私鑰解密數據,再看客戶端的公鑰能不能驗證客戶端發過來的簽名,再校驗這個data是一段時間內沒登錄過的,驗證通過後再看這個公鑰是不是已在數據庫中存在,不存在說明是首次登錄,已存在是二次登錄,驗證通過後網站給使用相同隨機數data的網頁客戶端發送登錄成功cookie

總結

本身功能不復雜,主要用了一個非對稱的私鑰簽名公鑰驗證,和非對稱的公鑰加密私鑰解密。
在設計中,對以下攻擊進行了防禦:

  • 網站釣魚,二維碼中的回調url使用了站點私鑰簽名,防止篡改回調url
  • 重放攻擊,第5步中校驗了的隨機數據是第一步生成的,是短時間唯一的
  • 中間人攻擊,可以防止app與服務器自己的中間人攻擊,但瀏覽器與服務器之間通訊還是需要走https

如果您想使用請留言,如果您覺得哪裏有安全漏洞更請留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章