1
說起密碼,你會想起什麼?
密碼太多,記不住?
圖省事所有網站用同一個密碼,一個洩露了,手忙腳亂地去改密碼?
網站被脫庫,數據庫信息洩露,密碼丟失?
這一切都的根本原因就是:服務器保存了我們的密碼(不管是明文的還是Hash過的)。
我們需要把自己記憶的密碼發給服務器做驗證,這就給了攻擊者可乘之機。
那能不能別保存密碼了,換個方式,讓服務器保存我們的指紋、虹膜等信息,行不行?
萬萬不可,這樣雖然不用記憶各種密碼了,但攻擊者一旦獲得這些生物信息,那就可以假冒我們,真是可以為所欲為了。
並且本質上它和保存密碼是一樣的,都是「和服務器共享了一個秘密」。
2
那就別和服務器共享秘密了吧!可是如果不共享,服務器怎麼知道「你就是你」呢?服務器無法做身份驗證(Authentication)了!
這個問題早在幾十年前就被迪菲和赫爾曼考慮過了,他們提出了非對稱的密鑰算法。
這種算法中每個人可以持有一對密鑰:public key (公鑰)和 private key (私鑰)。
只不過,迪菲和赫爾曼並沒有找到一個合適的算法來生成公鑰和私鑰, 一年後,麻省理工學院的三個教授基於大數的因數分解提出了RSA算法,才解決了這個問題。
利用非對稱這種漂亮的性質,我們為自己的賬號生成一對兒公鑰和私鑰。
私鑰自己保存,公鑰發給服務器保存,這樣就不用和它共享秘密了。
登錄的時候,服務器給我們發一段隨機消息,我們對它做簽名(即對消息做Hash ,然後用本地保存的私鑰加密),把簽名發給服務器,服務器用對應的公鑰來驗證簽名,如果簽名沒問題,就證明瞭這的確是一次合法的登錄。
私鑰非常重要,不能讓任何人知道,不能發給任何系統,最好是保存在本地的一個硬件中,通過指紋、面部識別、聲音、PIN等方式來訪問。
這裡引入了一個新的抽象層,認證器,讓它和服務器打交道,我們只是用指紋等手段授權對私鑰的訪問。
計算機的任何問題都可以引入一個抽象層來解決,真是至理名言。
用這種方式,登錄將會變成這樣:
1.輸入用戶名
2.點擊登錄
3.生物識別(指紋等)
4.登錄成功
即使網站被脫庫,攻擊者拿到了公鑰,也沒法冒充你幹壞事,因為公鑰本來就是公開的。
他想獲得私鑰的途徑就是拿到認證器(比如保存在手機中),但是想使用認證器還需要你的指紋等生物信息,這對於茫茫互聯網上兩個未曾謀面的人來說太難了。
說到這裡,不由地再感慨一下,提出和實現非對稱密鑰的前輩們實在是太偉大了。
3
這種認證方式不是我想出來的,是一個叫做FIDO(Fast IDentity Online)聯盟提出想法,並且制定了一系列FIDO協議。
FIDO概念簡單,想真正實現是很難的。
我們用瀏覽器登錄網站的時候,網站系統得改造,支持FIDO協議。
瀏覽器也得支持FIDO協議,可以提示用戶用FIDO的方式註冊或者登錄。
瀏覽器還需要和認證器進行交互,用戶提供生物信息授權訪問認證器,這就得需要硬件和操作系統出馬了。
如果筆記本和台式機沒有指紋識別等設備,還得考慮和手機的聯動(例如讓手機掃個二維碼,然後使用手機端認證器。)
這涉及到多方利益,是個生態系統,不是一家公司能搞定的,所以FIDO是個聯盟,包含了全世界的IT大佬。
在這些IT大佬中,有三位舉足輕重:
Google : Android + Chrome瀏覽器
Apple :iOS + Safari瀏覽器
微軟: Windows + Edge瀏覽器
這三位幾乎統治了操作系統和瀏覽器市場,沒有它們的參與,FIDO是玩不起來的。
今年5月,Google , Apple和微軟宣佈加大力度,推進對FIDO通用無密碼登錄標準的支持,努力實現無縫、安全的無密碼登錄:
1.允許用戶在多個設備(甚至新設備)上自動訪問FIDO登錄憑證(私鑰),而不需要重新註冊戶
2. 在任何操作系統和瀏覽器上,當用戶想用FIDO登錄網站的時候,手機都可以用來做驗證。例如,蘋果手機可以幫助驗證Edge瀏覽器上的FIDO登錄。
如果能做到這兩點,密碼就真的被幹掉了。
當然,新事物的發展不會那麼一帆風順的,尤其是牽扯到各方利益的情況下。
FIDO聯盟2012年就成立了,2014年發佈FIDO UAF和U2F協議,2019年FIDO2協議中的WebAuthn被W3C接受為互聯網的標準。同年Microsoft Hello 通過FIDO2兼容認證。
直到今年,三巨頭才宣佈要加大對FIDO的支持,說一年後在各個平台上提供無密碼功能。承諾能不能實現,我們只有拭目以待。
也許有一天,你突然發現,你用指紋識別就可以登錄網站了,到時候可以回過頭來看看這篇文章。
最後留個小問題吧:如果保存私鑰的設備(例如手機)丟失了,該怎麼辦?■
Be the first to comment